Labyrinth of Wisdom

-This is My Archive-


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円未満なので取得されない

参考