0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【SQL Server】GROUP BY句/HAVING句を使用したデータ取得

Last updated at Posted at 2022-08-10

GROUP BY句を使う機会が久々にあったので、備忘として記載致します。
取得したデータのグループ化を行えます。集約関数でデータ取得したい時に使う事が私は多いです。

例えば下記テーブルが存在しているとして、各levelの平均attack値の抽出を行いたい場合等に使用します。selct カラム名 from テーブル名 の後にGROUP BY カラム名を付け加えます。

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以上の場合のデータを抽出してみます。

image.png

HAVING句
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以上と条件を含めてみます。

WHEREを付け加えた
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触る機会がないのですが、、泣

簡単ではございますが、以上です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?