【SQL実践|実務向け】実務で差がつく!GROUP BY句を使いこなすデータ集計の基本と応用

導入

データベース管理者として現場で最も頻繁に行う作業の一つが「データの集計」です。膨大なレコードの中から特定の条件に基づいた合計値や平均値が必要になった際、GROUP BY句は避けて通れません。しかし、単にグループ化するだけでなく、結果の可読性を高める手法や、パフォーマンスを考慮した記述を理解しておくことは、データ分析の精度を向上させる上で極めて重要です。本記事では、GROUP BY句の基本から、実務で重宝するテクニックまでを解説します。

基礎知識

GROUP BY句は、指定したカラムの値が同じデータを「一つのグループ」としてまとめるための命令です。通常、SELECT文において「集計関数(COUNT, SUM, AVG, MAX, MINなど)」と組み合わせて使用されます。グループ化を行うことで、個々の行単位ではなく、特定のカテゴリ単位での統計的な情報を容易に抽出できるようになります。

実装/解決策

グループ化を行う際は、「どのカラムを軸にするか」を明確にすることが重要です。単一カラムだけでなく、複数のカラムを組み合わせることで、より詳細な階層構造での集計も可能です。また、集計結果に対してさらに条件を絞り込みたい場合は、WHERE句ではなく、グループ化後のデータに対して作用する「HAVING句」を使用する点に注意してください。

サンプルプログラム

以下は、売上管理テーブル(report)を想定した、実務で使える集計クエリの例です。まずはテーブル作成とデータ投入を行い、その後に集計を試してください。


— 1. テスト用テーブルの作成
CREATE TABLE report (
name VARCHAR(10),
color VARCHAR(10),
sales INT
);

— 2. サンプルデータの投入
INSERT INTO report VALUES (‘PC’, ‘Black’, 4500), (‘Mobile’, ‘White’, 3800), (‘PC’, ‘White’, 5100), (‘PC’, ‘Black’, 4600), (‘Mobile’, ‘Black’, 3900), (‘Mobile’, ‘White’, 4200);

— 3. 基本的な集計(商品名ごとの売上合計)
SELECT name, SUM(sales) AS total_sales
FROM report
GROUP BY name;

— 4. 応用:WITH ROLLUPを使用した階層的な合計の算出
— グループごとの合計に加え、全体の総計も同時に出力されます
SELECT name, SUM(sales) AS total_sales
FROM report
GROUP BY name WITH ROLLUP;

応用・注意点

現場で陥りやすいバグとして、「SELECT句に指定したカラムがGROUP BY句に含まれていない」というケースがあります。多くのSQLエンジンでは、集計対象ではないカラムをSELECT句に含めるとエラーになるか、予期せぬ値が表示されます。必ず「グループ化の基準にするカラム」と「集計関数」の組み合わせを意識してください。

また、データ量が多いテーブルでGROUP BYを使用する場合、該当カラムにインデックスが貼られていないとパフォーマンスが大幅に低下します。集計クエリの実行計画(EXPLAIN)を確認し、必要に応じてインデックスを設計することが、DBAとしての腕の見せ所です。

コメント

タイトルとURLをコピーしました