グループ化を行う(GROUP BY句)

GROUP BY句を指定することで、行をグループ化することができる。また、グループ関数を使って同一グループ内における列の値の合計や平均などを計算することができる。

グループ化のイメージ

GROUP BY句の記述形式

SELECT 列名1,列名2,〜列名n

グループごとに結果が1つになる列や関数を記述する
FROM 表名1,表名2,表名n
WHERE 抽出条件
GROUP BY 列名1,列名2

ここで指定された列でグループ化がおこなわれる

記述形式中の”グループごとに結果が1つになる列や関数を記述する”の意味であるが、グループ化が可能な列という意味である。例えば、売上明細の「連番」は、固有の値であるため別の行になる。したがって、グループ化が行えない。

売上明細の一部
売上No連番数量
1110
127
1325
2115
223

売上Noごとにグループ化を行いたい場合、GROUP BY句に連番を指定すると、違う行(別のグループ) になってしまうのでうまくグループ化が行えない。

売上明細の一部
売上No数量
110
17
125
215
23

売上Noだけを指定すると、同じ行(売上No)でグループ化することができる。

《例題1》

売上明細から売上Noごとの数量の合計を求める。

売上明細

SELECT文

SELECT 売上No,SUM(数量) ← 売上Noと売上金額の合計
FROM 売上明細
GROUP BY 売上No ← 売上Noでグループ化を行う

− 実行結果 −

実行結果

売上Noごとの数量の合計が表示されている

グループ関数

例題のSELECT句の中でSUMという関数が使用されている。これはグループ集計をおこなう関数である。SUMのほかに次の関数が使用できる。

グループ関数

関 数機能記述例
SUM合計を求めるSUM(列名または、計算式)
AVG平均を求めるAVG(列名または、計算式)
MAX最大値を求めるMAX(列名または、計算式)
MIN最小値を求めるMIN(列名または、計算式)
COUNT行数を求めるCOUNT(列名),COUNT(*)

《例題2》

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

SELECT文

SELECT 売上No,SUM(単価*数量) ← 売上Noと売上金額合計
FROM 商品表, 売上明細
WHERE 商品表.商品CD=売上明細.商品CD

商品表と売上明細を商品CDで結合
GROUP BY 売上No ← 売上Noでグループ化を行う

− 実行結果 −

実行結果

GROUP BY句は複数の列を指定できる。このとき注意が必要なことは、SELECT句の列の指定で、グループ関数と計算式を除き、GROUP BY句で指定された列をすべて含んでいなくてはならないということである。

Point

グループ関数使用上のポイント