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を使った集約関数で四半期ごとの総売上、平均注文額、ユニーク顧客数などの主要指標を表示する場面。