Hatena::ブログ(Diary)

松本崇博 Blog (SQL Server Tips) このページをアンテナに追加 RSSフィード

2010-02-03 SQL Server 2008 からの新機能 その10

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 を利用してシンプルに記述できるようになります。

f:id:matu_tak:20100205004444j:image

次の 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(受注日)

f:id:matu_tak:20100205004443j:image

この 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(受注日)) , () )

f:id:matu_tak:20100205004442j:image


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

http://www.microsoft.com/japan/sqlserver/2008/self-learning/default.mspx

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

トラックバック - http://d.hatena.ne.jp/matu_tak/20100203/1265298337