GROUP BY 子句中的運算式可在 FROM 子句中包含資料表、衍生資料表或檢視表的資料行。這些資料行不必出現在 SELECT 子句的 <select> 清單中。
<select> 清單中任何非彙總運算式內的每一個資料表或檢視表資料行都必須包含在 GROUP BY 清單內:
-
允許使用下列陳述式:
SELECT ColumnA, ColumnB FROM T GROUP BY ColumnA, ColumnB
SELECT ColumnA + ColumnB FROM T GROUP BY ColumnA, ColumnB
SELECT ColumnA + ColumnB FROM T GROUP BY ColumnA + ColumnB
SELECT ColumnA + ColumnB + constant FROM T GROUP BY ColumnA, ColumnB
-
不允許使用下列陳述式:
SELECT ColumnA, ColumnB FROM T GROUP BY ColumnA + ColumnB
SELECT ColumnA + constant + ColumnB FROM T GROUP BY ColumnA + ColumnB.
如果 SELECT 子句 <select list> 包括彙總函式,GROUP BY 會計算每個群組的摘要值。這些稱為向量彙總。
不符合 WHERE 子句之條件的資料列會在執行任何群組作業之前就被移除。
HAVING 子句會搭配 GROUP BY 子句一起使用,以篩選結果集中的群組。
GROUP BY 子句不會排序結果集,請使用 ORDER BY 子句來排序結果集。
如果群組資料行包含 Null 值,系統會把所有 Null 值都視為相等,並將它們放入單一群組中。
您不能搭配別名使用 GROUP BY 來取代 AS 子句中的資料行名稱,除非此別名會取代 FROM 子句中衍生資料表內的資料行名稱。
GROUPING SETS 清單中重複的群組集合將不會被刪除。若要產生重複的群組集合,可以指定資料行運算式一次以上,或是列出同樣由 GROUPING SETS 清單內 CUBE 或 ROLLUP 所產生的資料行運算式。
ROLLUP、CUBE 和 GROUPING SETS 支援相異彙總,例如 AVG (DISTINCT column_name)、COUNT (DISTINCT column_name) 和 SUM (DISTINCT column_name)。
ROLLUP、CUBE 和 GROUPING SETS 不能在索引檢視表中指定。
GROUP BY 或 HAVING 不能直接用於 ntext、text 或 image 的資料行上。這些資料行可當做函數中的引數使用,該函數會傳回另一個資料類型的值,例如 SUBSTRING() 和 CAST()。
不能直接在 <column_expression> 中指定 xml 資料類型方法。請改為參閱使用 xml 資料類型方法的使用者定義函數,或參閱使用這些方法的計算資料行。
GROUPING SETS、ROLLUP 和 CUBE 的 GROUP BY 限制
語法限制
GROUP BY 子句中不允許使用 GROUPING SETS,除非它們屬於 GROUPING SETS 清單的一部分。例如,不允許 GROUP BY C1, (C2,..., Cn),但允許 GROUP BY GROUPING SETS (C1, (C2, ..., Cn))。
GROUPING SETS 內不允許使用 GROUPING SETS。例如,不允許 GROUP BY GROUPING SETS (C1, GROUPING SETS (C2, C3))。
在具有 ROLLUP、CUBE 或 GROUPING SETS 關鍵字的 GROUP BY 子句中,不允許使用非 ISO ALL、WITH CUBE 和 WITH ROLLUP 關鍵字。
大小限制
如果是簡單的 GROUP BY,運算式的數目沒有任何限制。
如果是使用 ROLLUP、CUBE 或 GROUPING SETS 的 GROUP BY 子句,運算式數目的上限為 32,而可以產生的最大群組集合數目為 4096 (212)。下列範例失敗是因為 GROUP BY 子句太複雜:
-
下列範例會產生 8192 (213) 個群組集合。
GROUP BY CUBE (a1, ..., a13)
GROUP BY a1, ..., a13 WITH CUBE
-
下列範例會產生 4097 (212 + 1) 個群組集合。
GROUP BY GROUPING SETS( CUBE(a1, ..., a12), b )
-
下列範例也會產生 4097 (212 + 1) 個群組集合。
CUBE () 和 () 群組集合都會產生總計資料列,而且不會刪除重複的群組集合。
GROUP BY GROUPING SETS( CUBE(a1, ..., a12), ())
ISO 和 ANSI SQL-2006 GROUP BY 功能的支援
SQL Server 2008 支援 SQL-2006 標準內包含的所有 GROUP BY 功能,但是以下語法例外:
-
GROUP BY 子句中不允許使用群組集合,除非它們屬於明確 GROUPING SETS 清單的一部分。例如,此標準中允許使用
GROUP BY Column1, (Column2, ...ColumnN),但是 SQL Server 中則不允許。允許使用 GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)) 或 GROUP BY Column1, Column2, ... ColumnN,其語意相當於之前的 GROUP BY 範例。這是為了避免 GROUP BY Column1, (Column2, ...ColumnN) 可能錯誤地解譯為 GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN))。這在語意上並不相同。
-
群組集合內不允許使用群組集合。例如,SQL-2006 標準中允許使用
GROUP BY GROUPING SETS (A1, A2,…An, GROUPING SETS (C1, C2, ...Cn)),但是 SQL Server 中則不允許。SQL Server 2008 允許 GROUP BY GROUPING SETS( A1, A2,...An, C1, C2, ...Cn ) 或 GROUP BY GROUPING SETS( (A1), (A2), ... (An), (C1), (C2), ... (Cn) )。這些範例在語意上與第一個 GROUP BY 範例相同,而且語法更清楚。
-
一般 GROUP BY 子句中不允許使用 GROUP BY [ALL/DISTINCT] 或具有 GROUPING SETS、ROLLUP、CUBE、WITH CUBE 或 WITH ROLLUP 建構。ALL 為預設值而且是隱含的。
比較支援的 GROUP BY 功能
下表描述根據 SQL Server 版本和資料庫相容性層級所支援的 GROUP BY 功能。
|
功能
|
SQL Server 2005 Integration Services
|
SQL Server 2008 相容性層級 100
|
SQL Server 2008 相容性層級 90 或更高層級
|
|---|
|
DISTINCT 彙總
|
不支援 WITH CUBE 或 WITH ROLLUP。
|
支援 WITH CUBE、WITH ROLLUP、GROUPING SETS、CUBE 或 ROLLUP。
|
與 SQL Server 2008 相容性層級 100 相同。
|
|
GROUP BY 子句中具有 CUBE 或 ROLLUP 名稱的使用者定義函數
|
允許在 GROUP BY 子句中使用使用者定義函數 dbo.cube (arg1,...argN) 或 dbo.rollup (arg1,...argN)。
例如:
|
不允許在 GROUP BY 子句中使用使用者定義函數 dbo.cube (arg1,...argN) 或 dbo.rollup (arg1,...argN)。
例如:
SELECT SUM (x)
FROM T
GROUP BY dbo.cube(y)
傳回下列錯誤訊息:「關鍵字 'cube'|'rollup' 附近的語法不正確」。
若要避免這個問題,請使用 [dbo].[cube] 取代 dbo.cube,或使用 [dbo].[rollup] 取代 dbo.rollup。
允許使用下列範例:
SELECT SUM (x)
FROM T
GROUP BY [dbo].[cube](y)
|
GROUP BY 子句中允許使用使用者定義函數 dbo.cube (arg1,...argN) 或 dbo.rollup (arg1,...argN)。
例如:
SELECT SUM (x)
FROM T
GROUP BY dbo.cube(y)
|
|
GROUPING SETS
|
不支援
|
支援
|
支援
|
|
CUBE
|
不支援
|
支援
|
不支援
|
|
ROLLUP
|
不支援
|
支援
|
不支援
|
|
總計,例如 GROUP BY ()
|
不支援
|
支援
|
支援
|
|
GROUPING_ID 函數
|
不支援
|
支援
|
支援
|
|
GROUPING 函數
|
支援
|
支援
|
支援
|
|
WITH CUBE
|
支援
|
支援
|
支援
|
|
WITH ROLLUP
|
支援
|
支援
|
支援
|
|
移除 WITH CUBE 或 WITH ROLLUP 的重複群組
|
支援
|
支援
|
支援
|