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

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

複数フィールドでグループ化する

複数のレコードを束ねるGROUP BY句には、複数のフィールドを「,」で列挙できます。すると「大グループ→小グループ」といった形の階層化ができます。


- 日付と商品でグループ化する -

GROUP BY句に複数のフィールドを列挙した場合、左から順にフィールドの値がグループ化されます。まず左端のフィールドの値が同じレコードがグループ化され、その中で2番目のフィールドの値が異なる場合は、それらがさらにグループ化され……という形です。

「累積売上_fx」に対して「伝票日付」と「商品名」でグループ化してみましょう。以下のようなSQLとなります。

 SELECT 伝票日付, 商品名
 FROM 累積売上_fx
 GROUP BY 伝票日付, 商品名

実行結果は画面2の通りです。強調表示させた「伝票日付が10月10日」となっている3件のレコードに注目してください。画面3のように、元になったテーブル「累積売上_fx」には、10月10日の売上記録が4件あります。そのうち2件で、同じ商品「商品ID:550205/和食器セット楓5人用」が販売されています。

伝票日付でグループ化したあと、さらに「商品名」でグループ化しているため、『同じ日に販売された同じ商品』が1件にまとめられたのです。




- フィールドの順序を入れ替える -

次のようなSQLを使えば日付と顧客でグループ化できます。まず日付でグループ化し、次いで同じ日付同士でお客様IDによってグループ化……という形です。

お客様IDと氏名は一対のものですから、氏名によるグループ化に意味はありませんが、実行結果を見るときにはIDだけでも氏名だけでもわかりにくいため、敢えて両方を指定しています。

 SELECT 伝票日付, お客様ID, 氏名
 FROM 累積売上_fx
 GROUP BY 伝票日付, お客様ID, 氏名


上記の結果では日付によるグループ化が先に行われているため、顧客ごとの売上状況を見るには適していません。レコードを先に顧客ごとにまとめるには、GROUP BY句で顧客を特定する「お客様ID」または「氏名」を「伝票日付」より前(左側)に指定します。

 SELECT お客様ID, 氏名, 伝票日付
 FROM 累積売上_fx
 GROUP BY お客様ID, 氏名, 伝票日付

こうすれば、画面5のように『同じ顧客で先にグループ化され、その中で日付別にまとめられた』形になります。



- 表示の順序とグループ化の順序 -

グループ化される順序はGROUP BY句に列挙した順です。SELECTで示すフィールドの並びはグループ化に影響しません。従って、上と同じグループ化の結果に対して日付を先に表示させることもできます。

 SELECT 伝票日付, お客様ID, 氏名
 FROM 累積売上_fx
 GROUP BY お客様ID, 氏名, 伝票日付

GROUP BY句のフィールド並びは先の例と変わりませんが、SELECTに列挙するフィールド順が「伝票日付, お客様ID, 氏名」となっているため、画面6のように先に伝票日付が表示されます。しかし、グループ化の結果は先の例と同じになります。




トップページ
サンプルのテーブルを確認する
複数フィールドでグループ化する
日付と商品でグループ化する
フィールドの順序を入れ替える
表示の順序とグループ化の順序
レコードを絞り込んでグループ化する
HAVING句とWHERE句
さらに詳細な集計処理へ
あとがき
Copyright © MESCIUS inc. All rights reserved.