首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server COMPUTE BY 子句詳解:產生分組小計與總計的替代方案

     編輯:關於SqlServer

COMPUTE BY vs GROUP BY

特性GROUP BYCOMPUTE BY
結果集單一結果集 (彙總列)多結果集 (明細 + 小計/總計)
SELECT 清單僅群組欄 + 彙總函數可包含非群組欄位
彙總定義在 SELECT 清單在 COMPUTE 子句
客戶端處理簡單需處理多結果集 (游標)

語法


SELECT select_list
FROM table
ORDER BY group_columns
COMPUTE { aggregate_function(column) [ ,... ] } [ BY group_columns ];

範例 (pubs 資料庫 titles 表)

-- 1. 總計
SELECT type, price, advance
FROM titles
ORDER BY type
COMPUTE SUM(price), SUM(advance);

-- 2. 分組小計
SELECT type, price, advance
FROM titles
ORDER BY type
COMPUTE SUM(price), SUM(advance) BY type;

第二個查詢回傳 12 個結果集:每組一個明細結果集 + 一個小計結果集。

規則限制

  1. 不可搭配 DISTINCT 與列統計函數。
  2. COMPUTE ... BY 欄位必須出現在 SELECT 清單。
  3. 不可搭配 SELECT INTO (結果非規則資料列)。
  4. 必須有 ORDER BY,且 BY 欄位順序需與 ORDER BY 前 N 欄一致。
  5. 若無 BY,可省略 ORDER BY (僅總計)。
  6. 多欄位 BY 產生多層小計 (大組 → 子組)。
  7. 多個 COMPUTE BY 針對不同群組各產生統計。
  8. 單一 COMPUTE BY 可包含多個彙總函數。
  9. COMPUTE 無 BY 時僅對全集統計。

資料類型限制

COMPUTE / COMPUTE BY 子句中 不可包含 ntext、text、image 型別欄位。

現代替代方案

-- 使用 GROUPING SETS / ROLLUP (SQL 2008+)
SELECT type, SUM(price) AS SumPrice, SUM(advance) AS SumAdvance
FROM titles
GROUP BY ROLLUP (type);  -- 含總計列 (type=NULL)

-- 或應用層處理:先查明細,再用程式計算小計/總計

結論

COMPUTE BY 為舊版相容功能,新專案不建議使用。現代應用請改用 GROUPING SETS、ROLLUP、CUBE 或應用層運算,結果集結構規則、效能佳、工具支援完整。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved