GROUP BY句を使う機会が久々にあったので、備忘として記載致します。
取得したデータのグループ化を行えます。集約関数でデータ取得したい時に使う事が私は多いです。
例えば下記テーブルが存在しているとして、各levelの平均attack値の抽出を行いたい場合等に使用します。selct カラム名 from テーブル名 の後にGROUP BY カラム名を付け加えます。
1> select * from vanilla;
2> go
code level attack defense name
----------- ----------- ----------- ----------- ------------------------------
1 1 300 200 ワイト
2 8 3000 2500 ブルーアイズホワイトドラゴン
3 4 800 2000 ホーリー・エルフ
4 6 2500 1200 デーモンの召喚
5 4 1500 1200 ワイバーンの戦士
6 7 2500 2100 ブラックマジシャン
7 3 600 1500 闇・道化師のサギー
8 3 1200 700 ベビードラゴン
9 4 1400 1200 砦を守る翼竜
10 4 1300 1400 グレムリン
1> select level,AVG(attack) as avg_attack from vanilla group by level;
2> go
level avg_attack
----------- -----------
1 300
3 900
4 1250
6 2500
7 2500
8 3000
グループ化を行った後に、データを条件付きで抽出したい場合はHAVING句を使用します。
条件指定でデータ抽出を行いたい場合はWHERE句を使用すればよいですが、集約関数を条件に入れたい場合は実行タイミングの問題でWHERE句だとエラーになります。
HAVING句は、GROUP BY句の後ろに記述します。
各レベルで、平均attack値が1000以上の場合のデータを抽出してみます。
1> select level,AVG(attack) as avg_atk from vanilla group by level having AVG(attack) >= 1000;
2> GO
level avg_atk
----------- -----------
4 1250
6 2500
7 2500
8 3000
(4 行処理されました)
WHERE句も併用して使用可能です。WHERE → GROUP BY → HAVING の順番で実行されます。
WHEREで条件を絞った後に、HAVINGでも絞っている感じです。
select ~ from ~ where ~ group by ~ having ~ で実行出来ます。
先ほど流したSQLに、levelが5以上と条件を含めてみます。
1> select level,AVG(attack) as avg_atk from vanilla where level >= 5 group by level having AVG(attack) >= 1000;
2> GO
level avg_atk
----------- -----------
6 2500
7 2500
8 3000
グループ化はあんまり業務上では使う機会がなかったので、いい勉強になりました。そもそも、最近はSQL触る機会がないのですが、、泣
簡単ではございますが、以上です。