1. 程式人生 > >實現資料分類彙總的SQL語句

實現資料分類彙總的SQL語句

現有表Test,內容如下: 
ID   Catalog    Num 
1          A            3 
1          B            5
2          A            8 
2          B            2
 
現在想按ID查詢出這種結果:
-------------------- 
1          A           3
1          B           5
彙總小計:      8
2          A           8 
2          B           2
彙總小計:     10 
 
問:該如何實現?

在生成包含小計和合計的報表時,ROLLUP 運算子很有用。ROLLUP 運算子生成的結果集類似於 CUBE 運算子所生成的結果集。
========================
CUBE 運算子生成的結果集是多維資料集。多維資料集是事實資料的擴充套件,事實資料即記錄個別事件的資料。擴充套件建立在使用者打算分析的列上。這些列被稱為維。多維資料集是一個結果集,其中包含了各維度的所有可能組合的交叉表格。
 
CUBE 運算子在 SELECT 語句的 GROUP BY 子句中指定。該語句的選擇列表應包含維度列和聚合函式表示式。GROUP BY 應指定維度列和關鍵字 WITH CUBE。結果集將包含維度列中各值的所有可能組合,以及與這些維度值組合相匹配的基礎行中的聚合值。
========================= 
 
CUBE 和 ROLLUP 之間的區別在於: 
 
CUBE 生成的結果集顯示了所選列中值的所有組合的聚合。
 
ROLLUP 生成的結果集顯示了所選列中值的某一層次結構的聚合。

The ROLLUP operator is useful in generating reports that contain subtotals and totals. The ROLLUP operator generates a result set that is similar to the result sets generated by the CUBE operator.

The differences between CUBE and ROLLUP are:

  • CUBE generates a result set showing aggregates for all combinations of values in the selected columns.
  • ROLLUP generates a result set showing aggregates for a hierarchy of values in the selected columns.

最後查詢語句如下:

SELECTCASEWHEN (GROUPING(ID) =1THEN'ALL'ELSEISNULL(ID, 'UNKNOWN')
       
ENDAS ID,
       
CASEWHEN (GROUPING(Catalog) =1THEN'ALL'ELSEISNULL(Catalog, 'UNKNOWN')
       
ENDAS Catalog,
       
SUM(Num) AS Num
FROM Test
GROUPBY ID, Catalog WITH ROLLUP