Oracle

匯總後訂購 - oracle 11g

  • December 23, 2018

我在 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 使用者,但我發現了一篇關於它的有趣文章:

Oracle SQL GROUP BY – 完整指南

向下滾動到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<>在這裡擺弄

引用自:https://dba.stackexchange.com/questions/225643