GROUP BYの意味がわからなかったです。(以下のコマンド)
SELECT divisions.division_name,COUNT(*) FROM divisions
JOIN members ON divisions.division_id = members.division_id
GROUP BY divisions.division_name,divisions.division_id
ORDER BY divisions.division_id ASC;
自分には以下の疑問が出ました。
①GROUP BY divisions.division_name,divisions.division_id でなぜ二つ指定するんだろう?
②SELECTにdivisions.division_id がなくてもGROUP BY にdivisions.division_id を指定していいのか?
③SELECTにdivisions.division_id がなくてもORDER BY にdivisions.division_id を指定していいのか?
自分の理解では以下のようになっています。
①について、ORDER BY divisions.division_id ASC;の並びにするためにはGROUP BYでdivisions.division_idの指定が必要。
②について、SELECTになくても、GROUP BY にdivisions.division_id を指定してOK。
二つ指定することによって、二つの値を持つ、一つの組み合わせができるイメージ。(詳細は後述します。)
③について、SELECTになくても、ORDER BY にdivision_id を指定してOK。GROUP BY にdivisions.division_id を指定しているため、使用することができる。
②の後述
division.csv
101 ,営業部
102 ,人事部
103 ,システム部
104 ,総務部
104 ,人事部
上記ファイルを GROUP BY division_id,division_nameで指定すると
結果は以下のようになります。
#実行したコマンドです。
SELECT division_name,COUNT(*) FROM divisions GROUP BY division_id,division_name ORDER BY division_id ASC;
division_name | count
---------------+-------
営業部 | 1
人事部 | 1
システム部 | 1
人事部 | 1
総務部 | 1
(5 rows)
102 ,人事部 と 104 ,人事部の組み合わせがGROUP BYで登録してあるため、
項目として人事部が二つあります。
人事部としてまとめて表示されそうですが、これは102 ,人事部と 104 ,人事部という
組み合わせが一つずつ登録されているため上記のようになります。
逆にGROUP BY にdivisions.division_id を指定していないと、以下のようになります。
#実行したコマンドです。
SELECT division_name,COUNT(*) FROM divisions GROUP BY division_name;
division_name | count
---------------+-------
総務部 | 1
人事部 | 2
システム部 | 1
営業部 | 1
(4 rows)
人事部が2になり、division_nameごとに集計されています。
以上で説明を終わります。