GROUP BY (Transact-SQL)

更新: 2006 年 7 月 17 日

指定要放置輸出資料列的群組。如果 SELECT 子句 <select list> 包括彙總函數,GROUP BY 會計算每個群組的摘要值。當指定 GROUP BY 時,GROUP BY 清單應該包括選取清單中之任何非彙總運算式中的每個資料行,否則,GROUP BY 運算式必須完全符合選取清單運算式。

ms177673.note(zh-tw,SQL.90).gif附註:
如果未指定 ORDER BY 子句,利用 GROUP BY 子句傳回的群組,不會依照任何特定順序。若要指定特定資料排序,我們建議您一律使用 ORDER BY 子句。

主題連結圖示Transact-SQL 語法慣例

語法

[ GROUP BY [ ALL ] group_by_expression [ ,...n ] 
    [ WITH { CUBE | ROLLUP } ] 
] 

引數

  • ALL
    包括所有群組和結果集,即使沒有任何資料列符合 WHERE 子句所指定的搜尋條件也是如此。當指定 ALL 時,不符合搜尋條件之群組的摘要資料行都會傳回 Null 值。您不能搭配 CUBE 或 ROLLUP 運算子來指定 ALL。

    在存取遠端資料表的查詢中,如果查詢中也有 WHERE 子句,便不支援 GROUP BY ALL。

  • group_by_expression
    這是執行分組的運算式group_by_expression 也稱為分組資料行。group_by expression 可以是一個資料行,或參考 FROM 子句所傳回之資料行的非彙總運算式。選取清單所定義之資料行別名無法用來指定分組資料行。

    ms177673.note(zh-tw,SQL.90).gif附註:
    group_by_expression 中無法使用 textntextimage 類型的資料行。

    如果是不包含 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 所提供一般資料列之外,也在結果集中導入摘要資料列。群組是依階層式順序來摘要,從群組中的最低層級到最高層級。群組階層取決於分組資料行的指定順序。分組資料行的順序變更,可能會影響結果集所產生的資料列數。

    ms177673.note(zh-tw,SQL.90).gif重要事項:
    當您使用 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) ;

請參閱

參考

SELECT (Transact-SQL)
SELECT 子句 (Transact-SQL)

其他資源

使用 CUBE 來摘要資料
使用 ROLLUP 來摘要資料

說明及資訊

取得 SQL Server 2005 協助

變更歷程記錄

版本 歷程記錄

2006 年 7 月 17 日

新增內容:
  • 新增範例 C。

2005 年 12 月 5 日

變更的內容:
  • 修正範例 B。