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で実装できます。
