グループ化されたデータから条件にあったグループを抽出(HAVING句)

スポンサードリンク

GROUP BY句を使用してグループ化を行って、抽出条件を指定するには、HAVING句で抽出条件を指定する。

GROUP BY句でグループ化句を指定したときは、WHERE句では表の結合条件を指定し、抽出条件はHAVING句で指定する。

HAVING句の記述形式

SELECT 列名1,列名2, 〜列名n
FROM 表名1,表名2,〜表名n
WHERE 抽出条件 ← 表の結合条件を記述する
GROUP BY 列名1,列名2 ← 指定された列の値でグループ化
HAVING 抽出条件 ← 抽出条件

《例題1》

売上明細と商品表から売上Noごとの売上金額合計を求め、売上金額が3000以上の行を抽出する。売上金額は単価*数量で計算する。

売上明細と商品表
SELECT文

SELECT 売上No,SUM(単価*数量) ← 売上Noと売上金額合計を表示
FROM 商品表, 売上明細
WHERE 商品表.商品CD=売上明細.商品CD ← 表の結合条件
GROUP BY 売上No ← 売上Noでグループ化をおこなう
HAVING SUM(単価*数量) >=3000 ←売上金額が3000以上の行を抽出する

− 実行結果 −

実行結果

HAVING句を指定しているで、売上金額(SUM(単価*数量))が3000より大きい行が抽出されている

例題のSQL文の実行順序は次のとおりである。

  1. FROM句で指定された「商品表」と「売上明細」を読み込む
  2. WHERE句で指定した条件「商品表.商品CD=売上明細.商品CD」に基づいて、商品表の商品CDと売上明細の商品CDが一致する行を抽出する(表の結合条件)
  3. GROUP BY句で指定された「売上No」でグループ化をおこなう
  4. グループ化されたレコードからHAVING句で指定された「SUM(単価*数量) >=3000」で抽出する
  5. SELECT句で指定された「売上No」と「SUM(単価*数量)」を表示する

スポンサードリンク

HAVING句を指定してその抽出結果をORDER BY句によってソートすることも可能である。

《例題2》

売上明細と商品表から売上Noごとの売上金額合計を求め、売上金額が3000以上の行を抽出し、売上金額の降順で表示する。なお、売上金額は単価*数量で計算する。

SELECT文

SELECT 売上No,SUM(単価*数量)
FROM 商品表, 売上明細
WHERE 商品表.商品CD=売上明細.商品CD
GROUP BY 売上No
HAVING SUM(単価*数量) >=3000M
ORDER BY SUM(単価*数量) DESC ← 売上金額の降順にソートする

実行結果

ORDER BY句の指定によって売上金額の降順にソートされている。