Developer

SOQLで集計関数を使ってみよう【セールスフォース】

Developer
この記事は約5分で読めます。

こんにちは、アンダーソンです。
今日は集計関数を使ったSOQLを紹介していきたいと思います。
Apexでの使い方なども紹介していきます。

スポンサーリンク

集計関数の種類

まず集計関数の種類を下記に記します。

  • AVG
  • COUNT
  • COUNT_DISTINCT
  • MIN
  • MAX
  • SUM

では一つづつみていきましょう。

AVG

平均値を出す集計関数です。
例えば商談の平均をとる場合に下記のようなSOQLを発行します。

SELECT AVG(Amount) FROM Opportunity

また商談のフェーズごとの金額などを知りたい時には下記のようにグルーピングします。

SELECT StageName,AVG(Amount) FROM Opportunity Group By StageName

また全ての集計関数を使う時は別名を使うこともできます。
Apexで取得の際は別名を決めておくとわかりやすいかと思います。(あとで説明します。)

SELECT StageName name,AVG(Amount) avg FROM Opportunity Group By StageName

COUNT

選択した項目名の数を数えます。
Count()もしくはCount(Id)はSQLでのCount(*)と同じです。

SELECT COUNT() FROM Opportunity
SELECT COUNT(Id) FROM Opportunity

AVGと同じくグルーピングすることも可能です。下記は商談所有者ごとのレコード数をカウントしています。

SELECT Owner.Name,COUNT(Id) FROM Opportunity Group By Owner.Name

COUNT_DISTINCT

こちらは重複除外をしたカウントになります。

SELECT Account.Name,COUNT_DISTINCT(Contact__c) FROM Opportunity Group By Account.Name

上記は取引先名ごとの取引先責任者数(カスタム項目)の数を数えています。取引先責任者が複数ある場合でもカウントは重複除外されますので、条件に合致していれば1とカウントするなどの使い方ができます。

MIN&MAX

最小と最大を取得する関数です。
AVGで使ったSOQLに少し加えてみましょう。

SELECT MIN(Amount),MAX(Amount),AVG(Amount) FROM Opportunity

こうすれば金額の最小、最大、平均が一気に取れます。
またこれもグループ分けすることで各フェーズや担当者ごとのそれぞれの値をみることも可能です。

SELECT StageName,MIN(Amount),MAX(Amount),AVG(Amount) FROM Opportunity GROUP BY StageName

SUM

こちらはカウントではなく集計です。
これも先ほどのSOQLにもう一つ追加してみましょう。

SELECT StageName,MIN(Amount),MAX(Amount),AVG(Amount),SUM(Amount) FROM Opportunity GROUP BY StageName

これで全ての金額を集計した金額を取得できます。

HAVING句

ここまで理解できたでしょうか?
実際に開発者コンソールでSOQLを実行してみることをおすすめします。

次にHAVING句を使って集計結果を絞り込みます。
例えばSUMを使って集計したが、ある一定の金額以上の数字のみを条件として出したい場合に
下記のように指定することで絞り込むことが可能です。

SELECT StageName,MIN(Amount),MAX(Amount),AVG(Amount),SUM(Amount) FROM Opportunity GROUP BY StageName HAVING SUM(Amount) > 5000000

これで集計が500万以上のもののみ返してくれます。

もちろん他にもCountが1以上のものやAVGが一定以上のものなどの使い方もできますので実際に試してみてください。
ちなみにHAVING句ではWHERE句と同じくAND、OR、!=など全ての条件指定がサポートされているみたいなので
いろいろ試してみましょう。

Apexで使う時の取得の仕方

集計関数のSOQLは型が特殊になります。オブジェクトのリストではなく集計型?のリストになります。

List<AggregateResult> arList = [ここに集計SOQLを書く];

返された値はグルーピングされている値はそのままの名前で入り、集計された項目は初めから順番に
expr0.1.2・・・といった具合に名前がつけられます。
取得の際に後々のことを考えると別名をつけておくとみやすくなります。
例えば下記のようにしておくとリストの中がわかりやすいです。

SELECT StageName,MIN(Amount) min,MAX(Amount) max,AVG(Amount) avg,SUM(Amount) sum FROM Opportunity GROUP BY StageName
別名指定なし
別名指定あり

Apexで取得する際はリスト型なので下記のように取得できます。

Decimal min = arList[0].get('min');

または

for (AggregateResult ar : arList) {
    system.debug(ar.get('max'));
}

という形です。getメソッドを使うことに注意しましょう。
また中に入ってる形式は全てobject型になりますので、例えば項目に対して挿入する場合などは

(Decimal)ar.get('max')

のように型を指定する必要がありますので注意しましょう。

まとめ

ぜひ一度全てのSOQLを試しに使ってみてください。
組織の数字を集計して反映させるなどの要件はよくあることだと思いますので、
開発者としては絶対に押さえておかないといけない技術の一つです。

いろいろ試してみて身につけていきましょう。

その他の開発に関する記事はこちらです。

Developerも含めた試験問題にチャレンジしてみましょう。

コメント