Oracle
匯總後訂購 - oracle 11g
我在 group by 表達式中使用 rollup() 函式來顯示結果查詢,但我的輸出如下:
Year Month AmountOfMoney ==== ===== ============= 1998 March 130.00 1998 April 450.00 1988 - 580.00 1999 January 120.00 1999 April 550.00 1999 - 670.00 - - 1250.00
如何按總排序,然後是年,然後是(年,月)
Year Month AmountOfMoney ==== ===== ============= - - 1250.00 1988 - 580.00 1999 - 670.00 1998 March 130.00 1998 April 450.00 1999 January 120.00 1999 April 550.00
我不是 ORACLE 使用者,但我發現了一篇關於它的有趣文章:
向下滾動到GROUPING 函式,您將找到有關如何將 GROUP BY 與 ROLLUP 一起使用的範例:
引用自文章
有幾個與分組相關的 SQL 函式可以幫助您辨識和使用組。
在我們前面的範例中,我們注意到對於組中未考慮的列,小計的值為 NULL。
由於基礎數據,我們如何判斷哪些值是小計,哪些值是 NULL?
這就是 GROUPING 功能可以提供的幫助。
GROUPING 函式將單個列作為參數。輸出為 1 或 0:
如果該列被用作小計的一部分並且顯示為 NULL,則返回 1。如果基礎值為 NULL 或任何其他值,則返回 0。
您還可以按這些列排序,將小計放在 開頭或結尾,而不是放在結果的中間。
根據這一點,您可以使用下一個語法來產生預期的結果:
SELECT Year, Month, SUM(Amount) as AmoutOfMone FROM YourTable GROUP BY ROLLUP (Year, Month) ORDER BY GROUPING(Year) DESC, GROUPING(Month) DESC, Year ASC, Month ASC;
由於這個問題在這裡有一個先前的問題,我用我的小提琴添加了這個新資訊並且它工作正常。
/* aggregated sales by year-month */ SELECT T.CALENDAR_YEAR AS Year, T.CALENDAR_MONTH_DESC AS Month, SUM(S.AMOUNT_SOLD) AS AmountOfMoney FROM SALES S JOIN TIMES T ON T.TIME_ID = S.TIME_ID WHERE S.PROD_ID = 1 GROUP BY ROLLUP (T.CALENDAR_YEAR, T.CALENDAR_MONTH_DESC) ORDER BY GROUPING (T.CALENDAR_YEAR) DESC, GROUPING (T.CALENDAR_MONTH_DESC) DESC, CALENDAR_YEAR ASC, CALENDAR_MONTH_DESC ASC;
年份 | 月 | 金錢數額 ---: | ----: | ------------: *空*| *空*| 450 2018 | *空*| 450 2018 | 1 | 100 2018 | 2 | 200 2018 | 3 | 150
db<>在這裡擺弄