グループ単位で集計した結果の条件指定(HAVING)| プログラミングの砂場

プログラミング学習やタイピング練習に役立つツールを公開しているサイトです。

グループ単位で集計した結果の条件指定(HAVING)

「HAVING」を使うと、「GROUP BY」で集計した結果に対して条件の指定ができます。

目次

1. はじめに

まずは、Shouhinの内容を確認してください。

SELECT * FROM Shouhin;
shouhin_id name name_kana category_id price
1 アスパラガス あすぱらがす 1 256
2 かぼちゃ かぼちゃ 1 300
3 キャベツ きゃべつ 1 128


Shouhinの全データ(全行)が取得されました。

「GROUP BY」の例で使用するのは、「category_id」です。

「category_id」は、1が野菜、2が果物、空(NULL)が未定の商品ということを意味しています。

このデータに対して、「GROUP BY」で集計した結果に「HAVING」を使い条件指定をしていきます。

2. HAVINGの使い方

「HAVING」を使うと、「GROUP BY」で集計した結果に対して条件を指定することができます。

構文

SELECT
  グループ化対象列名,
  集約関数
FROM
  Shouhin
GROUP BY
  グループ化対象列名
HAVING
  条件

条件は、集約関数の集計結果に対して指定する場合がほとんどです。

商品カテゴリ別平均価格のうち、その平均価格が300円以上の商品カテゴリを取得してみます。

確認のため、最初に、全商品カテゴリ別の平均価格だけを取得してみましょう。
(まだHAVINGは使っていません。)

SELECT
    category_id,
    AVG( price )
FROM
    Shouhin
GROUP BY
    category_id
category_id AVG( price )
3500.0000
1 186.8000
2 524.6000

結果、商品カテゴリごと(category_id=nullは未定商品、1は野菜、2は果物)の平均価格が取得できました。

次に、「HAVING」を使って、上の平均価格表のうち300円以上の商品カテゴリに絞ってみます。

SELECT
    category_id,
    AVG( price )
FROM
    Shouhin
GROUP BY
    category_id
HAVING
    AVG( price ) >= 300
category_id AVG( price )
3500.0000
2 524.6000

「GROUP BY category_id」の集計結果に対して「HAVING」を使い、条件「AVG( price ) >= 300」を指定することで、平均価格が300円以上の商品カテゴリのみに絞り込まれました。

平均価格が300円以上の商品カテゴリは、「未定の商品と、果物」ということがわかります。

ポイントとしては、SELECT句にある集約関数の記述(この場合、「AVG( price )」)をそのまま「HAVING」の条件の記述に使う事です。

「AVG( price )」は、「GROUP BY category_id」によって集計される「商品カテゴリごとの平均価格を知っている」ので、その平均価格(AVG( price ))に対して「HAVING」を使って何かしらの条件を指定するというイメージです。

3. まとめ

「HAVING」の使い方について見てきました。

「HAVING」は「GROUP BY」の集計結果に対して、条件を指定し行を絞り込むことができます。

「HAVING」に指定する条件は、SELECT句にある集約関数の記述をそのまま使います。


次は、「重複を排除する(DISTINCT)」についてです。


TOP