こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

SQLのグループ化動作について

グループ化と集計関数の動作について質問させてください。
MySQL、SQLiteて実行しました。

[テーブル:ninzu_tbl]
kensexninzu
福岡150
福岡260
佐賀140
佐賀230
長崎160
長崎250

性別(sex)でgroup byして人数を求めるSQLを実行した場合、
sumを使用するSQL(1)を実行すると福岡、佐賀、長崎のそれぞれの人数が表示されますが、
sumを使用しないSQL(2)を実行した場合、長崎の人数のみが表示され、福岡、佐賀の人数が
空白になります。

group byでグループ化した場合に、最後尾のキー項目以外のデータが
上書きされ、福岡、佐賀のデータが飛んでしまったのではと考えましたが、
(1)を実行した場合に県ごとのデータが表示される理由がわかりません。

理由がわかる方、教えていただけませんか?
もしくは、グループ化の処理イメージができるサイトを教えてください。

よろしくお願いします。

(1) 結果が表示されるSQL
select
sex as '性別'
, sum(case when ken = '福岡' then ninzu else null end) as '福岡'
, sum(case when ken = '佐賀' then ninzu else null end) as '佐賀'
, sum(case when ken = '長崎' then ninzu else null end) as '長崎'
from ninzu_tbl
group by sex


(2) 福岡と佐賀の結果が表示されないSQL
select
sex as '性別'
, case when ken = '福岡' then ninzu else null end as '福岡'
, case when ken = '佐賀' then ninzu else null end as '佐賀'
, case when ken = '長崎' then ninzu else null end as '長崎'
from ninzu_tbl
group by sex

投稿日時 - 2016-05-12 19:51:38

QNo.9171589

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

GROUP BY句に指定しない項目をSELECT句に指定する場合、関数を使うのが通常の使い方です。
(2)のようなSQLは、MySQL以外の処理系ではエラーになることもあります。
(1)のSQLは集計関数を使っているので、問題ないです。
ちなみに、ご質問のケースでは県と性別の組み合わせがユニークになっているので、集計関数の意味を見出しにくいのかも知れません。
例えば、データが次のようなものでしたら、集計関数の意味がわかりやすいと思います。

[ninzu_tbl]
ken, sex, age, ninzu
----------
福岡, 1, 10, 80
福岡, 1, 20, 70
福岡, 2, 10, 120
福岡, 2, 20, 100
福岡, 3, 30, 40
佐賀, 1, 10, 60
佐賀, 1, 20, 80
佐賀, 2, 10, 100
佐賀, 2, 20, 130
長崎, 1, 10, 60
長崎, 1, 20, 80
長崎, 1, 30, 20
長崎, 2, 10, 120
長崎, 2, 20, 100
長崎, 2, 30, 30

この場合、(1)のSQLを実行すると、年齢をまたいで性別ごとの人数を集計します。
もっと大きく、県別の人数を集計するなら、
SELECT ken, SUM(ninzu) FROM ninzu_tbl GROUP BY ken;
とかすればいいですし、県と年齢ごとの人数を集計するなら、
SELECT ken, age, SUM(ninzu) FROM ninzu_tbl GROUP BY ken, age;
とすればいいです。

このように、任意の項目でグループ化して集計等をするのがGROUP BYの用途だと思います。

以上、ご参考になれば幸いです。

投稿日時 - 2016-05-13 10:07:44

お礼

回答と解説ありがとうございます。
Group byをなんとなく理解して使用していましたが、意味を理解して使用しないといけないと勉強になりました。

投稿日時 - 2016-05-18 09:40:26

あなたにオススメの質問