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

SQL 排序、分組與統計 10 大實用技巧:ORDER BY、GROUP BY、HAVING、ROLLUP、CUBE 完全指南

     編輯:關於SqlServer

技巧 1:ORDER BY 讓資料有序

依字母/數字排序,相似值聚集。但 排序 ≠ 分組:ORDER BY 顯示每筆記錄,分組代表多筆記錄彙總。

技巧 2:GROUP BY 移除重複值

同值僅顯示一列。SELECT ZIP FROM Customers GROUP BY ZIP 回傳唯一郵遞區號。SELECT 清單必須符合 GROUP BY 清單,除非包含彙總函數。GROUP BY 不保證輸出順序,需配合 ORDER BY。

技巧 3:WHERE 先於 GROUP BY 過濾

SELECT ZIP FROM Customers WHERE State = 'KY' GROUP BY ZIP 僅回傳肯州郵遞區號。WHERE 在分組前計算,不支援彙總函數。

技巧 4:GROUP BY ALL 保留所有分組

加入 ALL 關鍵字:SELECT ZIP, COUNT(ZIP) FROM Customers WHERE State = 'KY' GROUP BY ALL ZIP。結果包含所有 ZIP,非肯州分組計數顯示 0。遠端查詢不支援 GROUP BY ALL。

技巧 5:HAVING 分組後過濾

WHERE 過濾記錄,HAVING 過濾分組。SELECT ZIP, COUNT(ZIP) FROM Customers GROUP BY ZIP HAVING COUNT(ZIP) = 1 僅顯示單一客戶的郵遞區號。HAVING 在 GROUP BY 後計算,常搭配彙總函數。

技巧 6:WHERE vs HAVING 判斷口訣

  • WHERE 在 GROUP BY 前 → 過濾記錄
  • HAVING 在 GROUP BY 後 → 過濾分組

技巧 7:彙總函數統計分組資料

SELECT OrderID, SUM(Cost * Quantity) AS OrderTotal FROM Orders GROUP BY OrderID。SELECT 包含彙總函數時,可不受 GROUP BY 欄位限制。

技巧 8:ROLLUP 產生分層小計

SELECT Customer, OrderNumber, SUM(Cost*Quantity) FROM Orders GROUP BY Customer, OrderNumber WITH ROLLUP。每分組產生小計,第一列為總計。不支援 DISTINCT 與 GROUP BY ALL。

技巧 9:CUBE 產生交叉小計

... GROUP BY Customer, OrderNumber WITH CUBE。在 ROLLUP 基礎上,再對每個定義分組的欄位產生小計 (所有欄位組合)。不支援 GROUP BY ALL。

技巧 10:GROUPING 函數識別小計列

SELECT GROUPING(Customer), OrderNumber, SUM(...) FROM Orders GROUP BY Customer, OrderNumber WITH CUBE。結果:1 = 小計列 (ROLLUP/CUBE 產生),0 = 明細列 (原始 GROUP BY 產生)。

快速對照表

子句/選項執行階段支援彙總典型用途
WHEREGROUP BY 前否列層級過濾
GROUP BY核心分組否 (SELECT 除外)建立分組
HAVINGGROUP BY 後是分組層級過濾
WITH ROLLUP分組後是階層小計
WITH CUBE分組後是交叉小計
GROUPING()輸出時N/A識別小計列
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved