Apexで学ぶSOQLグループ化(GROUP BY)完全ガイド

Apex開発においてデータ集計は非常に重要です。特に「レコード一覧を取得する」のではなく、「傾向や統計を出す」場面ではSOQLのGROUP BYと集計関数をApexから扱う必要があります。

本記事では、Apexでのグループクエリの使い方から実務での活用方法までを解説します。


1. Apexでのグループクエリの基本

ApexでもSOQLのGROUP BYはそのまま使用できます。

List<AggregateResult> results = [
    SELECT Status, COUNT(Id) cnt
    FROM Case
    GROUP BY Status
];

ポイント:

・戻り値はList
・通常のSObjectではない
・get()で値を取得する


2. AggregateResultの使い方

取得したデータは以下のように扱います。

for(AggregateResult ar : results) {
    String status = (String) ar.get('Status');
    Integer countVal = (Integer) ar.get('cnt');

    System.debug('Status: ' + status + ' Count: ' + countVal);
}

重要:

・フィールド名はエイリアスを使う
・型キャストが必要


3. 複数条件でのグループ化

List<AggregateResult> results = [
    SELECT OwnerId, Status, COUNT(Id) cnt
    FROM Case
    GROUP BY OwnerId, Status
];

この場合は「担当者 × ステータス」で集計されます。


4. HAVING句の使用

集計後の条件絞り込みです。

List<AggregateResult> results = [
    SELECT OwnerId, COUNT(Id) cnt
    FROM Case
    GROUP BY OwnerId
    HAVING COUNT(Id) > 5
];

👉 5件以上持っている担当者だけ取得


5. ApexでMapに変換するパターン

実務ではMap化が非常に重要です。

Map<String, Integer> statusCountMap = new Map<String, Integer>();

for(AggregateResult ar : results) {
    String status = (String) ar.get('Status');
    Integer cnt = (Integer) ar.get('cnt');

    statusCountMap.put(status, cnt);
}

これによりUIやロジックで扱いやすくなります。


6. 実務での活用例

■ ケース負荷分析

SELECT OwnerId, COUNT(Id)
FROM Case
WHERE Status != 'Closed'
GROUP BY OwnerId

→ 誰がどれくらい案件を持っているか


■ 売上分析

SELECT AccountId, SUM(Amount) total
FROM Opportunity
GROUP BY AccountId

→ 顧客ごとの売上集計


■ 優先度分析

SELECT Priority, COUNT(Id)
FROM Case
GROUP BY Priority

→ 問い合わせの重要度分布


7. よくあるミス

❌ SObjectとして受け取ろうとする

List<Case> cases = [SELECT Status, COUNT(Id) FROM Case GROUP BY Status];

→ エラーになる


❌ get()のキー間違い

エイリアスを付けないと扱いにくい

COUNT(Id) cnt

を必ず使う


❌ 型キャスト忘れ

AggregateResultはObjectなので必須


8. パフォーマンスのポイント

・必要なフィールドだけ取得
・WHEREで事前に絞る
・GROUP BYの粒度を最小限に

例:

SELECT Status, COUNT(Id)
FROM Case
WHERE CreatedDate = THIS_YEAR
GROUP BY Status

9. 設計視点の考え方

グループクエリは単なる集計ではなく:

👉 「業務判断のためのデータ生成」

です。

例:

・負荷分散 → OwnerId集計
・品質分析 → Status集計
・売上分析 → Account集計


まとめ

ApexでのGROUP BYは「データを理解するための武器」です。

単なる取得ではなく、ビジネスロジックに直結するため、設計レベルで使いこなすことが重要です。

AggregateResultとMap変換をマスターすれば、レポートレベルの分析ロジックをApexで実装できます。