blog
ブログ

salesforce技術ブログ(SOQLで集計関数の利用!)

SOQLでは、SQLで使用可能な一部の集計関数が使用可能です。(APIバージョン18以上)

今回は、その利用方法及び、注意事項です。

★SOQLで集計関数を使用する!

 

 

例えば、件数を取得する場合は、以下のような記述を行うと、取得可能です。

public class hogeController{
    public Integer recCount {get; set;}
    public void recordCountTest(){
        AggregateResult a = [select count(Id) cnt from hogeObj__c];
        // AggregateResultはMAP型なので↓の様に取得する
        recCount = Integer.valueOf(a.get('cnt'));
    }
}

 

特定の項目で集約したい場合など(例:select hoge__c, count(id) cnt from hogeObj__c group by hoge__c)は、

AggregateResult部分をリストで取得することで対応可能となります。

ただし、AggregateResultの内容はString型で返ってくるため、変数に入れる場合は型に注意が必要となります。

(valueOfを使用)

 

なお、デバッグログを参照すると、countで1件に集約されたとしても、取得件数分Selectカウントされているので、

ガバナ制限を超えた件数を取得する場合には、注意が必要となります。

 例:2000件のデータをCOUNT関数で取得した場合
  クエリの結果→1レコード(Number of SOQL queries: 1 out of 100)
  ガバナ→Number of query rows: 2000 out of 50000

 

また、注意事項として、

集計関数を使うとLIMIT関数が使えなくなるため、ガバナ制限を超える件数をカウントする必要がある場合は、
forループでSOQLを実行し、ガバナ制限に達する前にソースコード内でbreakする必要があります。
public hogeController2{
     public void recordCountTest2(){
         Integer recCount = 0;
         for(hogeObj__c h : [select id from hogeObj__c]){
             recCount++;
             if(recCount == 45001){
                 // ※エラー処理等を記載
                 break;
             }
         }
    }
}
こうなると、もうCOUNTを使用することができませんので、COUNTの用途は非常に制限された
ものだと感じます。COUNT利用で、ガバナ制限を回避する方法をご存じの方は、是非ご連絡ください。
contact

ご相談・ご質問等ございましたら、お気軽にお問い合わせください。

翻訳