SOQL文での集計関数
SOQLで集計関数を使用する際に調べたことをメモしていきます。
今回の記事の説明用に下記のサンプルデータを使って例を記載していきます。
売上日/SalesDate | 名前/Name | 年齢/Age | 性別/Gender | 売上/Sales |
---|---|---|---|---|
2016-08-01 | Tom | 26 | 男性 | 280,000 |
2016-08-04 | Mary | 28 | 女性 | 275,000 |
2016-08-07 | John | 31 | 男性 | 310,000 |
2016-08-10 | Mary | 28 | 女性 | 360,000 |
2016-08-13 | Tom | 26 | 男性 | 240,000 |
SOQLの集計関数
SOQLで集計関数を使うにはAggregateResult
型を使用しなければいけません。
まずここがSQLと違うのでハマりやすいポイント。
// 全員の売上の合計を求めるSOQL AggregateResult[] aResults = [SELECT SUM(Sales__c) summary FROM Hoge__c]; System.debug('売上合計:' + aResults[0].get(summary) + '円'); // 売上合計:1465000円
サンプルでは合計を求めるSUM()
を使用していますが、最大値を求めるMAX()
等他にも関数があります。
詳細は公式リファレンスを参照。
GROUP BY句
GROUP BY
を使うことによって、指定した値別に結果を求めることが出来ます。
今回の例ではGROUP BY
で性別を指定しているので、男女別の売上の合計値を求めることが出来ます。
// 男女別に売上の合計を求めるSOQL AggregateResult[] aResults = [SELECT Gender, SUM(Sales__c) summary FROM Hoge__c GROUP BY Gender]; for(AggregateResult ar : aResults){ System.debug(ar.Gender + 'の売上合計:' + ar.get(summary) + '円'); } // 男性の売上合計:830000円 // 女性の売上合計:635000円
HAVING句
Having
を使うことによって、GROUP BY
で指定した値別の結果に絞り込み条件を指定することが出来ます。
Where
と似ていますが、Having
はグルーピングした後の値に条件を指定しているので、違いに注意が必要です。
今回の例ではGROUP BY
で名前を指定しているので、名前別の売上の合計値を求めることが出来ます。
// 名前別に売上の合計を求めるSOQL(売上合計が500,000円以上のみ) AggregateResult[] aResults = [SELECT Name, SUM(Sales__c) summary FROM Hoge__c GROUP BY Name Having summary >= 500000]; for(AggregateResult ar : aResults){ System.debug(ar.Name + 'の売上合計:' + ar.get(summary) + '円'); } // Tomの売上合計:520000円 // Maryの売上合計:635000円 // Johnは売上合計が500,000円未満なので取得されない
参考