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関数をはじめとする集計関数とグループ化によって、数値フィールドの値を集計する方法を紹介します。
サンプルファイル (LZH形式 1.50KB)
|
|
|