SQL Server 2008 の GROUPING SETS 関数によるグループ化 その1 UNION ALL の置き換え

SQL Server 2008 からは、GROUPING SETS 関数によるグループ化の構文がサポートされました。GROUPING SETS 関数は、GROUP BY 句とともに利用できる集計関数で、SQL 2003 標準規格で定義されているものです(Oracle 10g で搭載されている GROUPING SETS とも同じように利用することができます)。
GROUPING SETS は、複数の集計値を結合(UNION ALL)する場合や、WITH ROLLUP または CUBE を利用して複数項目の集計値を取得する場合の置き換えとして利用することができます。たとえば、次の UNION ALL(A 列でグループ化した集計結果と B 列でグループ化した集計結果を結合したもの)は、GROUPING SETS を利用してシンプルに記述できるようになります。

次の SQL があるとします(UNION ALL を利用)。

SELECT 区分名, NULL AS 年, SUM( od.数量 * od.単価) AS 受注金額
FROM 受注明細 od
	INNER JOIN 商品 s ON od.商品コード = s.商品コード
	INNER JOIN 商品区分 c ON s.区分コード = c.区分コード
GROUP BY 区分名
  UNION ALL
SELECT NULL AS 区分名, YEAR(受注日), SUM( od.数量 * od.単価) AS 受注金額
FROM 受注明細 od
	INNER JOIN 受注 o ON o.受注コード = od.受注コード
GROUP BY YEAR(受注日)

この SQL は、GROUPING SETS 関数を利用して、次のように置き換えることもできます。

SELECT 区分名, YEAR(受注日) AS 年, SUM( od.数量 * od.単価) AS 受注金額
FROM 受注明細 od
	INNER JOIN 受注 o ON o.受注コード = od.受注コード
	INNER JOIN 商品 s ON od.商品コード = s.商品コード
	INNER JOIN 商品区分 c ON s.区分コード = c.区分コード
GROUP BY GROUPING SETS ( (区分名), (YEAR(受注日)) )

このように GROUPING SETS 関数を利用すると、UNION ALL で集計値を結合するクエリをシンプルに記述できるようになります。


また、GROUPING SETS 関数では、次のように () を追加すると、全体合計を結果へ追加できるようになります。

SELECT 区分名, YEAR(受注日) AS 年, SUM( od.数量 * od.単価) AS 受注金額
FROM 受注明細 od  〜中略〜
GROUP BY GROUPING SETS ( (区分名), (YEAR(受注日)) , () )


そのほかの SQL Server 2008 の新機能の具体的な利用方法については、弊社執筆の SQL Server 2008 自習書シリーズ(下記 URL)の「SQL Server 2008 の注目の新機能をイチ早く試してみよう! 」編を参考にしてみてください。
http://www.microsoft.com/japan/sqlserver/2008/self-learning/default.mspx