データベース千夜一夜第20回

データの集計(2)~グループ化とレコードの絞り込み 長谷川裕行
有限会社 手國堂

さらに詳細な集計処理へ

GROUP BY句によるレコードのグループ化を試してきました。ここまでの段階では、単に同じ値のフィールドが1件のレコードにまとめられるだけのことですが、実際の集計作業では数値の計算が重要になってきます。具体的な集計処理の例を紹介しておきましょう。


- 一時的な関連付けを設定する -

グループ化の対象には、テーブルの他にビューも使えます。また、わざわざビューを作るまでもない一時的な処理では、SQLで複数のテーブルを関連付けた上で、その結果に対してグループ化することも可能です。

例えば、「累積売上_fx」には「仕入先」の情報が含まれていません。売上結果から仕入先別の傾向を見るには、「累積売上_fx」の「商品ID」から「商品_mr」の「仕入先ID」をたどり、さらに「仕入先_mr」の「仕入先名」を参照する必要があります。

この構造を図にすると画面12のようになり、以下のようなSQLになります。

 SELECT 仕入先_mr.仕入先名, 累積売上_fx.商品名
 FROM 累積売上_fx INNER JOIN
 商品_mr ON 累積売上_fx.商品ID = 商品_mr.商品ID INNER JOIN
 仕入先_mr ON 商品_mr.仕入先ID = 仕入先_mr.仕入先ID

この段階で、仕入先名を伴ったレコードが取得できます。




- 一時的なレコード群をグループ化する -

上記のSQLにGROUP BY句によるグループ化の指示を付け足すと、以下のようになります。

 SELECT 仕入先_mr.仕入先名, 累積売上_fx.商品名
 FROM 累積売上_fx INNER JOIN
 商品_mr ON 累積売上_fx.商品ID = 商品_mr.商品ID INNER JOIN
 仕入先_mr ON 商品_mr.仕入先ID = 仕入先_mr.仕入先ID
 GROUP BY 仕入先_mr.仕入先名, 累積売上_fx.商品名

これで、仕入先名によるグループ化が出来上がります。実行すると、画面14のようになります。

このようにSQLで関連付けを記述すれば、テーブルやビューに存在しないフィールドを元にグループ化できます。



- 合計数量を商品ごとにまとめる -

さて、これだけでは商品名と仕入先の関係しか分かりません。『どの商品がいくつ売れているか』を調べる方法を紹介しましょう。以下のようなSQLとなります。

 SELECT 仕入先_mr.仕入先名, 累積売上_fx.商品名, SUM(数量) AS 数量合計

 FROM 累積売上_fx INNER JOIN
 商品_mr ON 累積売上_fx.商品ID = 商品_mr.商品ID INNER JOIN
 仕入先_mr ON 商品_mr.仕入先ID = 仕入先_mr.仕入先ID
 GROUP BY 仕入先_mr.仕入先名, 累積売上_fx.商品名
 ORDER BY 仕入先_mr.仕入先名

1行目の最後にある「SUM(数量) AS 数量合計」が、『「数量」フィールドの値をグループごとに合計する』指示です。SUMは前回紹介したCOUNTと同じ集計関数で、引数に指定したフィールドの値を合計します。

最後にORDER BY句で「仕入先名」ごとの並べ替えを指示しているのは、同じ仕入先の商品をまとめて表示するためです。結果は画面15のようになります。



あとがき

GROUP BY句でレコードを束ねるだけでも、ある程度の傾向を読み取ることはできます。しかし、詳細な分析資料を作ったりグラフの元データとするような場合には、具体的な数値が必要になってきます。

次回は、SUM関数をはじめとする集計関数とグループ化によって、数値フィールドの値を集計する方法を紹介します。


Downloadサンプルファイル (LZH形式 1.50KB)



トップページ
サンプルのテーブルを確認する
複数フィールドでグループ化する
レコードを絞り込んでグループ化する
HAVING句とWHERE句
さらに詳細な集計処理へ
一時的な関連付けを設定する
一時的なレコード群をグループ化する
合計数量を商品ごとにまとめる
あとがき
Copyright © MESCIUS inc. All rights reserved.