複数のレコードを束ねる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のように先に伝票日付が表示されます。しかし、グループ化の結果は先の例と同じになります。
|
|
|