天天看點

實作資料分類彙總的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.
ELSE ISNULL(ID, 'UNKNOWN') 
       END AS ID, 
       CASE WHEN (GROUPING(Catalog) = 1) THEN 'ALL' 
            ELSE ISNULL(Catalog, 'UNKNOWN') 
       END AS Catalog, 
       SUM(Num) AS Num 
FROM Test 
GROUP BY ID, Catalog WITH ROLLUP