SQLの集計関数の使い方【SUM・AVG・COUNT・MAX・MIN/GROUP BY】
データを抽出できるようになったら、次は集計です。「今月の売上の合計は?」「商品ごとの平均単価は?」といった数字は、SQLの集計関数を使えば1行で求められます。
この記事では、よく使う5つの集計関数(SUM・AVG・COUNT・MAX・MIN)と、グループごとに集計するGROUP BYの使い方を、実行結果付きで解説します。
参考記事
SQLの基本 – まずはこれだけ覚えよう【初心者向け基礎ガイド】
SQLの基本 – WHERE句を用いた数値条件指定ガイド【初心者向け基礎ガイド】
SQL HAVING句の使い方【実行コード付き】
この記事で使うデータ
基本編の記事と同じ、商品別・日別の売上データ(テーブル名:sample_data)を使います。
| date | product | sales_amount |
|---|---|---|
| 2025-11-21 | beef_1 | 1200 |
| 2025-11-21 | beef_2 | 800 |
| 2025-11-21 | beef_1 | 1200 |
| 2025-11-21 | beef_1 | 1200 |
| 2025-11-22 | fish_1 | 300 |
| 2025-11-22 | beef_3 | 3000 |
| 2025-11-22 | fish_1 | 300 |
| 2025-11-22 | fish_1 | 300 |
| 2025-11-22 | beef_3 | 3000 |
| 2025-11-23 | fish_2 | 1600 |
集計関数とは
集計関数は、複数の行をまとめて1つの値にする関数です。よく使うのは次の5つです。
| 関数 | 意味 | 例 |
|---|---|---|
SUM(列) |
合計 | 売上の合計 |
AVG(列) |
平均 | 平均単価 |
COUNT(列) |
件数 | 注文件数 |
MAX(列) |
最大値 | 最高額の注文 |
MIN(列) |
最小値 | 最低額の注文 |
SUM:合計を求める
売上金額の合計を求めます。
SELECT
SUM(sales_amount) AS total_sales
FROM
sample_data
実行結果
| total_sales |
|---|
| 12900 |
AS total_sales は、結果の列に名前を付ける書き方です。付けなくても動きますが、付けておくと結果が読みやすくなります。
5つの関数をまとめて使う
集計関数は、SELECT句にカンマ区切りでいくつでも並べられます。
SELECT
COUNT(*) AS rows_cnt
, SUM(sales_amount) AS total
, AVG(sales_amount) AS avg_amount
, MAX(sales_amount) AS max_amount
, MIN(sales_amount) AS min_amount
FROM
sample_data
実行結果
| rows_cnt | total | avg_amount | max_amount | min_amount |
|---|---|---|---|---|
| 10 | 12900 | 1290 | 3000 | 300 |
COUNT(*) は行の数を数えます。データが10行なので、結果は10です。
COUNTとCOUNT(DISTINCT)の違い
「何種類の商品が売れたか」を知りたいときは、COUNT(DISTINCT 列) を使います。同じ値を1つとして数えてくれます。
SELECT
COUNT(product) AS cnt
, COUNT(DISTINCT product) AS product_cnt
FROM
sample_data
実行結果
| cnt | product_cnt |
|---|---|
| 10 | 5 |
COUNT(product) は10件ですが、商品の種類は beef_1・beef_2・beef_3・fish_1・fish_2 の5種類です。ユーザー数や商品数を数えるときは、DISTINCTを付け忘れないように注意しましょう。
※COUNT(列) は、その列が空(NULL)の行は数えません。COUNT(*) は空の行も含めて数えます。
GROUP BY:グループごとに集計する
実務で一番よく使うのが、「日付ごと」「商品ごと」に集計するパターンです。このときに使うのが GROUP BY です。
日付ごとの集計
SELECT
date
, COUNT(*) AS orders
, SUM(sales_amount) AS total_sales
FROM
sample_data
GROUP BY
date
ORDER BY
date
実行結果
| date | orders | total_sales |
|---|---|---|
| 2025-11-21 | 4 | 4400 |
| 2025-11-22 | 5 | 6900 |
| 2025-11-23 | 1 | 1600 |
商品ごとの集計(売上の多い順)
SELECT
product
, COUNT(*) AS orders
, SUM(sales_amount) AS total_sales
, AVG(sales_amount) AS avg_sales
FROM
sample_data
GROUP BY
product
ORDER BY
total_sales DESC
実行結果
| product | orders | total_sales | avg_sales |
|---|---|---|---|
| beef_3 | 2 | 6000 | 3000 |
| beef_1 | 3 | 3600 | 1200 |
| fish_2 | 1 | 1600 | 1600 |
| fish_1 | 3 | 900 | 300 |
| beef_2 | 1 | 800 | 800 |
GROUP BYのルール:SELECT句には、「GROUP BYに書いた列」と「集計関数」だけを書けます。たとえば上の例で date をSELECTに足すとエラーになります(どの日付を表示すればよいか決められないためです)。
WHEREと組み合わせる
WHERE で行を絞り込んでから集計することもできます。牛肉(beefから始まる商品)だけの日別売上を出してみましょう。
SELECT
date
, SUM(sales_amount) AS beef_sales
FROM
sample_data
WHERE
product LIKE 'beef%'
GROUP BY
date
ORDER BY
date
実行結果
| date | beef_sales |
|---|---|
| 2025-11-21 | 4400 |
| 2025-11-22 | 6000 |
11月23日はbeefの売上がないので、行ごと表示されません。
書く順番は SELECT → FROM → WHERE → GROUP BY → ORDER BY です。集計した結果に条件をかけたいとき(例:合計が5,000円以上の商品だけ)は、WHEREではなくHAVING句を使います。詳しくはSQL HAVING句の使い方をご覧ください。
平均値の小数を丸める
AVGの結果は小数になることが多いので、ROUND(値, 桁数) で丸めておくと見やすくなります。
SELECT
product
, ROUND(AVG(sales_amount), 1) AS avg_sales
FROM
sample_data
GROUP BY
product
まとめ
- 合計は
SUM、平均はAVG、件数はCOUNT、最大・最小はMAX・MIN - 種類の数を数えるときは
COUNT(DISTINCT 列) - グループごとの集計は
GROUP BY。SELECTには「GROUP BYの列」と「集計関数」だけを書く - 集計前の絞り込みは
WHERE、集計後の絞り込みはHAVING
※この記事のSQLは、BigQueryなど主要なデータベースで共通して使える書き方です。実行結果は、データベースによって小数の表示(1290 と 1290.0 など)が少し異なる場合があります。
集計関数とGROUP BYが使えるようになると、SQLでできることが一気に広がります。手元のデータでぜひ試してみてください。
