Share via


GROUP BY (Transact-SQL)

更新 : 2006 年 7 月 17 日

出力行を配置するグループを指定します。SELECT 句の <select list> に集計関数が含まれている場合は、GROUP BY によって各グループの集計値が計算されます。GROUP BY を指定する場合は、選択リスト内の非集計式内の各列が GROUP BY リストに含まれるか、GROUP BY 式が選択リスト式に正確に一致する必要があります。

ms177673.note(ja-jp,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(ja-jp,SQL.90).gifメモ :
    group_by_expression では、textntext、および 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 句によって提供される通常の行の他に、集計行を結果セットに含むことを指定します。グループは、グループ内の最も低いレベルから最も高いレベルへと、階層順にまとめられます。グループの階層は、グループ化列の指定順で決まります。グループ化列の順序を変更すると、結果セット内に生成される行の数が変わる場合があります。

    ms177673.note(ja-jp,SQL.90).gif重要 :
    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 を使用したデータの集約

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2006 年 7 月 17 日

追加内容 :
  • 例 C を追加しました。

2005 年 12 月 5 日

変更内容
  • 例 B を修正。