SQLでの重複データの扱い方について、基本的なカウント方法から応用的な集計テクニックまでを解説します。実務でよく使う具体例も交えて紹介していますが、あなたのプロジェクトに最適な方法は何でしょうか?
SQLで年代別集計とグループ化を実装する方法の解説
SQLを使って年齢データを年代別に集計する方法について、具体的なコード例と実装のポイントを解説します。初心者でも理解できる実践的な内容となっていますが、上級者にも役立つ応用テクニックはあるでしょうか?
年代別集計の基本的な実装方法として、CASE式を使用したアプローチが一般的です。以下のコードで、年齢データを10歳区切りの年代に分類できます。
SELECT
CASE
WHEN age < 20 THEN '10代以下'
WHEN age >= 20 AND age < 30 THEN '20代'
WHEN age >= 30 AND age < 40 THEN '30代'
WHEN age >= 40 AND age < 50 THEN '40代'
WHEN age >= 50 AND age < 60 THEN '50代'
WHEN age >= 60 THEN '60代以上'
ELSE 'その他'
END AS age_group,
COUNT(*) AS user_count
FROM users
GROUP BY age_group
ORDER BY age_group
生年月日から年齢を計算し、年代別に集計する場合は、TIMESTAMPDIFF関数を活用します。
SELECT
CASE
WHEN TIMESTAMPDIFF(YEAR, birthday, CURDATE()) < 20 THEN '10代以下'
WHEN TIMESTAMPDIFF(YEAR, birthday, CURDATE()) < 30 THEN '20代'
WHEN TIMESTAMPDIFF(YEAR, birthday, CURDATE()) < 40 THEN '30代'
WHEN TIMESTAMPDIFF(YEAR, birthday, CURDATE()) < 50 THEN '40代'
WHEN TIMESTAMPDIFF(YEAR, birthday, CURDATE()) < 60 THEN '50代'
ELSE '60代以上'
END AS age_group,
COUNT(*) AS user_count
FROM users
GROUP BY age_group
ORDER BY age_group
DIV演算子を使用すると、よりシンプルなコードで年代別集計が可能です。
SELECT
CONCAT((age DIV 10) * 10, '代') AS age_group,
COUNT(*) AS user_count
FROM users
GROUP BY age DIV 10
ORDER BY age_group
データの品質を確保するため、NULL値や異常値の処理は重要です。
SELECT
CASE
WHEN age IS NULL THEN '不明'
WHEN age < 0 OR age > 120 THEN 'エラー'
ELSE CONCAT((age DIV 10) * 10, '代')
END AS age_group,
COUNT(*) AS user_count
FROM users
GROUP BY
CASE
WHEN age IS NULL THEN '不明'
WHEN age < 0 OR age > 120 THEN 'エラー'
ELSE CONCAT((age DIV 10) * 10, '代')
END
HAVING age_group != 'エラー'
ORDER BY
CASE age_group
WHEN '不明' THEN 999
ELSE CAST(SUBSTRING(age_group, 1, 2) AS SIGNED)
END
大規模データベースでの年代別集計では、インデックスの活用や集計テーブルの作成が効果的です。
-- 集計用の一時テーブルを作成
CREATE TEMPORARY TABLE age_summary AS
SELECT
CASE
WHEN age < 20 THEN '10代以下'
WHEN age >= 20 AND age < 30 THEN '20代'
WHEN age >= 30 AND age < 40 THEN '30代'
WHEN age >= 40 AND age < 50 THEN '40代'
WHEN age >= 50 AND age < 60 THEN '50代'
ELSE '60代以上'
END AS age_group,
COUNT(*) AS user_count
FROM users
WHERE age IS NOT NULL
GROUP BY
CASE
WHEN age < 20 THEN '10代以下'
WHEN age >= 20 AND age < 30 THEN '20代'
WHEN age >= 30 AND age < 40 THEN '30代'
WHEN age >= 40 AND age < 50 THEN '40代'
WHEN age >= 50 AND age < 60 THEN '50代'
ELSE '60代以上'
END
-- インデックスを作成
CREATE INDEX idx_age_group ON age_summary(age_group)
このような最適化により、大規模データベースでも高速な年代別集計が可能になります。
以上の実装方法を組み合わせることで、効率的で正確な年代別集計を実現できます。特に大規模なデータベースを扱う場合は、パフォーマンスの観点からも適切な実装方法を選択することが重要です。