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

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

レコードを絞り込んでグループ化する

グループ化した結果をすべて提示するのではなく、必要なレコードだけに絞り込むこともできます。売上結果の「男女別」で試してみましょう。


- 男女別に切り分ける -

まず、売上結果を男女別に切り分けてみましょう。男女別の購買傾向がつかめます。SQLは次のようになります。GROUP BY句で「性別」を先に指定している点に注意してください。

a)
 SELECT 性別, 商品名
 FROM 累積売上_fx
 GROUP BY 性別, 商品名

なお、以下のようなSQLでも同じ結果を得られます。

b)
 SELECT 性別, 商品名
 FROM 累積売上_fx
 GROUP BY 商品名, 性別
 ORDER BY 性別


- ORDER BY句でも同じことができる -

b)のSQLでは、GROUP BY句で「商品名」を先に記述しているので、まず商品名ごとにグループ化され、同じ商品で「性別」が異なればさらにグループ分けされるのですから、この場合は
a)の例と同じ意味合いになります。ただ、最後にORDER BY句で「性別」フィールドの値によってレコードをまとめておかないと、表示結果は男女のレコードが入り乱れてしまいます。

また、金額など他の要素もグループ化の対象にすれば、フィールドを入れ替えたときに結果が異なります。単純に2つのフィールドでグループ化する場合、グループ化の順序が入れ替わっても、最終的に整列を行って同じ結果を得ることができます。グループ化と整列は、ただレコードをまとめるという機能だけを見ればほとんど同じです。もちろん、グループ化した上でさらに整列するのは非効率ですから、先に掲げた
a)の書き方が正解なのは言うまでもありません。





- 女性だけに絞り込む -

ここまでは、全レコードを対象に処理を行ってきました。今度は、上の男女別の傾向を「女性だけ」に絞ってみましょう。グループ化したレコードを絞り込むには、HAVING句を使います。書式は以下の通りです。

 SELECT <フィールドリスト>
 FROM <テーブル>
 GROUP BY <フィールドリスト>
 HAVING <条件>

<条件>で、レコードを絞り込むための条件を指定します。この場合は、「性別」フィールドの値が'女'となっているレコードだけ取り出したいので、SQLは以下のようになります。文字列型フィールドの値は''で囲むことを、忘れないようにしましょう。

 SELECT 商品名, 金額 ,性別
 FROM 累積売上_fx
 GROUP BY 商品名, 金額, 性別
 HAVING 性別='女'

これで、画面10のように女性の購入した商品だけが抽出されました。




トップページ
サンプルのテーブルを確認する
複数フィールドでグループ化する
レコードを絞り込んでグループ化する
男女別に切り分ける
ORDER BY句でも同じことができる
女性だけに絞り込む
HAVING句とWHERE句
さらに詳細な集計処理へ
あとがき
Copyright © MESCIUS inc. All rights reserved.