標籤:
首先部分說明:
Oracle的GROUP BY語句除了最基本的文法外,還支援ROLLUP和CUBE語句。如果是Group by ROLLUP(A, B, C)的話,首先會對(A、B、C)進行GROUP BY,然後對(A、B)進行GROUP BY,然後是(A)進行GROUP BY,最後對全表進行GROUP BY操作。
因工作要做個報表,因此想就在資料庫直接跑個報表出來,取公司部分資料整理如下:
SELECT CLP.ITEMNAME AS PORVINCE, CLC.ITEMNAME AS CITY, SUM(CASE WHEN C2.ITEMNAME= ‘標準產品‘ THEN C.BUSINESSSUM ELSE 0 END) AS 標準產品, SUM(CASE WHEN C2.ITEMNAME= ‘VIP產品‘ THEN C.BUSINESSSUM ELSE 0 END) AS VIP產品, SUM(C.BUSINESSSUM) AS 總計 FROM BUSINESS_CONTRACT C LEFT JOIN STORE_INFO S ON C.STORES = S.SNO LEFT JOIN CODE_LIBRARY CLP ON S.PROVINCE = CLP.ITEMNO AND CLP.CODENO = ‘ProvinceCodeByHand‘ LEFT JOIN CODE_LIBRARY CLC ON S.CITY = CLC.ITEMNO AND CLC.CODENO = ‘CityCodeByHand‘ LEFT JOIN business_type T ON C.BUSINESSTYPE=T.TYPENO LEFT JOIN CODE_LIBRARY c2 ON T.PROMOTIONTYPE = C2.ITEMNO AND C2.CODENO = ‘PromotionType‘WHERE CLP.ITEMNAME=‘廣東省‘OR CLP.ITEMNAME=‘湖南省‘GROUP BY CLP.ITEMNAME,CLC.ITEMNAME
查詢結果:
在這裡需要在最後加一行合計列,這裡可以用到自動彙總函數ROULLUP,與GROUP BY連用,寫法如下:
GROUP BY ROLLUP(CLP.ITEMNAME,CLC.ITEMNAME)
結果如下:
會發現,該函數會對廣東省及湖南省都有個小總計,最後是全部的總計,如果只需要對全部做一個總計,可以使用grouping_id進行美化,代碼如下:
GROUP BY ROLLUP(CLP.ITEMNAME,CLC.ITEMNAME)HAVING grouping_id(CLP.ITEMNAME,CLC.ITEMNAME)!=1
結果如下:
這裡對grouping_id說明:
總計是grouping_id=3
小計grouping_id=1
記錄是grouping_id=0
以上
[SQL]-Oracle分組函數ROULLUP的應用