SQL

SQLの集計関数の使い方【SUM・AVG・COUNT・MAX・MIN/GROUP BY】

酒井 裕麻株式会社Bistro 代表取締役社長

データを抽出できるようになったら、次は集計です。「今月の売上の合計は?」「商品ごとの平均単価は?」といった数字は、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でできることが一気に広がります。手元のデータでぜひ試してみてください。

CONTACT

データ活用のお悩み、
直接相談しませんか。

「何から始めればいいかわからない」段階でも大丈夫です。課題の整理からお手伝いします。