SQL集約関数: COUNT、SUM、AVG、MIN、MAX

データ集計のためのSQL集約関数COUNT、SUM、AVG、MIN、MAXをマスター。NULLの処理、DISTINCTによる集約、条件付きカウントも解説します。

Query

詳細な説明

SQL集約関数: COUNT、SUM、AVG、MIN、MAX

集約関数は、一連の入力値から単一の結果を計算します。SQLにおけるデータ集計とレポーティングの構成要素です。

5つの基本集約関数

SELECT
  COUNT(*) AS total_orders,
  COUNT(DISTINCT customer_id) AS unique_customers,
  SUM(total_amount) AS revenue,
  AVG(total_amount) AS avg_order_value,
  MIN(order_date) AS first_order,
  MAX(order_date) AS last_order
FROM orders
WHERE order_date >= '2025-01-01';

COUNTのバリエーション

COUNT(*)           -- すべての行をカウント(NULLを含む)
COUNT(column)      -- カラムの非NULL値をカウント
COUNT(DISTINCT col) -- 一意の非NULL値をカウント

NULLの処理

COUNT(*) を除くすべての集約関数はNULL値を無視します:

-- スコア: [100, NULL, 80, NULL, 90] の場合
SELECT
  COUNT(*) AS total_rows,      -- 5
  COUNT(score) AS non_null,    -- 3
  AVG(score) AS average,       -- 90 (270/3, NULLは除外)
  SUM(score) AS total          -- 270
FROM test_scores;

NULLを計算に含めるには COALESCE を使用します:

SELECT AVG(COALESCE(score, 0)) FROM test_scores;  -- 54 (270/5)

条件付き集約

条件付きカウントには CASE または FILTER(PostgreSQL)を使用します:

SELECT
  COUNT(*) AS total_orders,
  COUNT(CASE WHEN status = 'completed' THEN 1 END) AS completed,
  COUNT(CASE WHEN status = 'cancelled' THEN 1 END) AS cancelled,
  SUM(CASE WHEN status = 'completed' THEN amount ELSE 0 END) AS completed_revenue
FROM orders;

-- PostgreSQLのFILTER構文(より簡潔)
SELECT
  COUNT(*) FILTER (WHERE status = 'completed') AS completed,
  SUM(amount) FILTER (WHERE status = 'completed') AS completed_revenue
FROM orders;

統計的集約関数

SELECT
  STDDEV(salary) AS salary_stddev,
  VARIANCE(salary) AS salary_variance,
  PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary) AS median_salary
FROM employees;

パフォーマンスに関する注意

  • COUNT(*)はNULLのチェックを行わないため、一般にCOUNT(column)より高速
  • COUNT(DISTINCT)はソートまたはハッシュ操作が必要なため、大幅にコストが高い
  • 大規模データセットでの近似的なDISTINCTカウントには、HyperLogLog拡張の使用を検討する

集約関数は、分析、レポーティング、大規模データセットを意味のあるメトリクスに要約するあらゆるクエリに不可欠です。

ユースケース

ビジネスインテリジェンスダッシュボードが、GROUP BYを使った集約関数で四半期ごとの総売上、平均注文額、ユニーク顧客数などの主要指標を表示する場面。

Try It — SQL Formatter

フルツールを開く