GROUP BY (Transact-SQL)
更新 : 2006 年 7 月 17 日
出力行を配置するグループを指定します。SELECT 句の <select list> に集計関数が含まれている場合は、GROUP BY によって各グループの集計値が計算されます。GROUP BY を指定する場合は、選択リスト内の非集計式内の各列が GROUP BY リストに含まれるか、GROUP BY 式が選択リスト式に正確に一致する必要があります。
メモ : |
---|
ORDER BY 句を指定しない場合、GROUP BY 句でグループが返される順序には特に決まりはありません。データの特定の順序を指定するには、常に ORDER BY 句を使用することをお勧めします。 |
構文
[ 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 句で返される列を参照する非集計式を指定できます。選択リスト内に定義されている列の別名は、グループ化列の指定には使用できません。メモ : group_by_expression では、text、ntext、および image 型の列は使用できません。 CUBE または ROLLUP を含まない GROUP BY 句では、group_by_expression 項目の数はクエリにかかわる GROUP BY 列のサイズ、集計列、および集計値によって制限されます。この数制限は、クエリの中間結果を保持するために中間作業テーブル上に必要な 8,060 バイトを基本にしています。CUBE または ROLLUP を指定している場合は、最大 10 個のグループ化列を使用できます。
xml データ型のメソッドを group_by_expression の中で直接指定することはできません。代わりに、内部で xml データ型のメソッドを使用するユーザー定義関数か、それを使用する計算列を参照します。
CUBE
GROUP BY 句によって提供される通常の行の他に、集計行を結果セットに含むことを指定します。結果セット内のあらゆるグループおよびサブグループの組み合わせに対し GROUP BY 集計行を返します。GROUP BY 集計行は結果内では NULL として表示されますが、あらゆる値を示すのに使用されます。結果セット内の NULL 値が GROUP BY 集計値であるかどうかを判断するには、GROUPING 関数を使用します。結果セットの集計行の数は、GROUP BY 句に含まれる列数により決まります。GROUP BY 句内の各オペランド (列) は NULL でグループ化されたグループとその他のすべてのオペランド (列) に適用されるグループにバインドされます。CUBE ではあらゆるグループとサブグループの組み合わせを返すため、グループ化列の指定順にかかわらず、行の数は同じになります。
ROLLUP
GROUP BY 句によって提供される通常の行の他に、集計行を結果セットに含むことを指定します。グループは、グループ内の最も低いレベルから最も高いレベルへと、階層順にまとめられます。グループの階層は、グループ化列の指定順で決まります。グループ化列の順序を変更すると、結果セット内に生成される行の数が変わる場合があります。重要 : AVG(DISTINCT column_name)、COUNT(DISTINCT column_name)、および SUM(DISTINCT column_name) など非重複値の集計は、CUBE または ROLLUP を使用している場合はサポートされません。これらの関数を使用した場合、Microsoft SQL Server 2005 データベース エンジンはエラー メッセージを返し、クエリをキャンセルします。
例
A. 単純な GROUP BY 句を使用する
次の例では、SalesOrderDetail
テーブルから SalesOrderID
ごとの合計を取得します。
USE AdventureWorks ;
GO
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail sod
GROUP BY SalesOrderID
ORDER BY SalesOrderID ;
B. GROUP BY 句を複数のテーブルで使用する
次の例では、Address
テーブルと EmployeeAddress
テーブルを結合したものから、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 を使用したデータの集約
ヘルプおよび情報
変更履歴
リリース | 履歴 |
---|---|
2006 年 7 月 17 日 |
|
2005 年 12 月 5 日 |
|