實現(xiàn)數(shù)據(jù)分類匯總的SQL語句

字號:

現(xiàn)有表Test,內容如下: ID Catalog Num 1 A 3 1 B 52 A 8 2 B 2 現(xiàn)在想按ID查詢出這種結果: -------------------- 1 A 31 B 5 匯總小計: 82 A 8 2 B 2 匯總小計: 10 問:該如何實現(xiàn)?
    在生成包含小計和合計的報表時,ROLLUP 運算符很有用。ROLLUP 運算符生成的結果集類似于 CUBE 運算符所生成的結果集。 ======================== CUBE 運算符生成的結果集是多維數(shù)據(jù)集。多維數(shù)據(jù)集是事實數(shù)據(jù)的擴展,事實數(shù)據(jù)即記錄個別事件的數(shù)據(jù)。擴展建立在用戶打算分析的列上。這些列被稱為維。多維數(shù)據(jù)集是一個結果集,其中包含了各維度的所有可能組合的交叉表格。 CUBE 運算符在 SELECT 語句的 GROUP BY 子句中指定。該語句的選擇列表應包含維度列和聚合函數(shù)表達式。GROUP BY 應指定維度列和關鍵字 WITH CUBE。結果集將包含維度列中各值的所有可能組合,以及與這些維度值組合相匹配的基礎行中的聚合值。 ========================= CUBE 和 ROLLUP 之間的區(qū)別在于: 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.
    最后查詢語句如下:
    SELECT CASE WHEN (GROUPING(ID) = 1) THEN @#ALL@# 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