GROUP BY (Transact-SQL)
指定要放置輸出資料列的群組。如果 SELECT 子句 <select list> 包括彙總函數,GROUP BY 會計算每個群組的摘要值。當指定 GROUP BY 時,GROUP BY 清單應該包括選取清單中之任何非彙總運算式中的每個資料行,否則,GROUP BY 運算式必須完全符合選取清單運算式。
附註: |
|---|
| 如果未指定 ORDER BY 子句,利用 GROUP BY 子句傳回的群組,不會依照任何特定順序。若要指定特定資料排序,我們建議您一律使用 ORDER BY 子句。 |
- ALL
-
包括所有群組和結果集,即使沒有任何資料列符合 WHERE 子句所指定的搜尋條件也是如此。當指定 ALL 時,不符合搜尋條件之群組的摘要資料行都會傳回 Null 值。您不能搭配 CUBE 或 ROLLUP 運算子來指定 ALL。
在存取遠端資料表的查詢中,如果查詢中也有 WHERE 子句,便不支援 GROUP BY ALL。
- group_by_expression
-
這是執行分組的運算式。group_by_expression 也稱為分組資料行。group_by expression 可以是一個資料行,或參考 FROM 子句所傳回之資料行的非彙總運算式。選取清單所定義之資料行別名無法用來指定分組資料行。
附註: group_by_expression 中無法使用 text、ntext 和 image 類型的資料行。 如果是不包含 CUBE 或 ROLLUP 的 GROUP BY 子句,group_by_expression 項目數會受到 GROUP BY 資料行大小、彙總資料行,以及查詢所涉及的彙總值所限制。這項限制起源於保存中繼查詢結果時所需要的中繼工作資料表之 8,060 位元組限制。當指定 CUBE 或 ROLLUP 時,只允許最多 10 個分組運算式。
在 group_by_expression 中,無法直接指定 xml 資料類型方法。相反地,請參閱其中使用 xml 資料類型方法的使用者自訂函數,或參閱使用這些方法的計算資料行。
- CUBE
-
指定除了 GROUP BY 所提供一般資料列之外,也在結果集中導入摘要資料列。結果集中群組或子群組每個可能的組合,都會傳回一個 GROUP BY 摘要資料列。GROUP BY 摘要資料列會在結果中顯示成 NULL,但用來表示所有值。請利用 GROUPING 函數來判斷結果集中的 Null 值是否為 GROUP BY 摘要值。
結果集中的摘要資料列數,由 GROUP BY 子句所包含的資料行數目來決定。GROUP BY 子句中的每個運算元 (資料行) 都會繫結於分組 NULL 之下,且分組適用於所有其他運算元 (資料行)。由於 CUBE 會傳回群組和子群組每個可能的組合,因此,不論分組資料行的指定順序為何,資料列數都相同。
- ROLLUP
-
指定除了 GROUP BY 所提供一般資料列之外,也在結果集中導入摘要資料列。群組是依階層式順序來摘要,從群組中的最低層級到最高層級。群組階層取決於分組資料行的指定順序。分組資料行的順序變更,可能會影響結果集所產生的資料列數。
重要事項: 當您使用 CUBE 或 ROLLUP 時,不支援相異彙總,如 AVG(DISTINCT column_name)、COUNT(DISTINCT column_name) 和 SUM(DISTINCT column_name)。如果使用它們的話,Microsoft SQL Server 2005 Database Engine 會傳回錯誤訊息,且會取消查詢。
A. 使用簡單的 GROUP BY 子句
下列範例會從 SalesOrderID 資料表中,擷取每個 SalesOrderDetail 的總計。
USE AdventureWorks ; GO SELECT SalesOrderID, SUM(LineTotal) AS SubTotal FROM Sales.SalesOrderDetail sod GROUP BY SalesOrderID ORDER BY SalesOrderID ;
B. 搭配多份資料表使用 GROUP BY 子句
下列範例會從聯結了 EmployeeAddress 資料表的 Address 資料表中,擷取每個 City 的員工人數。
USE AdventureWorks ; GO SELECT a.City, COUNT(ea.AddressID) EmployeeCount FROM HumanResources.EmployeeAddress ea INNER JOIN Person.Address a ON ea.AddressID = a.AddressID GROUP BY a.City ORDER BY a.City ;
C. 搭配運算式使用 GROUP BY 子句
下列範例會使用 DATEPART 函數,擷取每年的銷售總額。選取清單和 GROUP BY 子句中必須出現相同的運算式。
USE AdventureWorks ; GO SELECT DATEPART(yyyy,OrderDate) AS Year, SUM(TotalDue) AS AverageOrderAmt FROM Sales.SalesOrderHeader GROUP BY DATEPART(yyyy,OrderDate) ORDER BY DATEPART(yyyy,OrderDate) ;

