tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:HAVINGクエリによる重複データの抽出を試してみました

HAVINGクエリによる重複データの抽出についてです。
f:id:tyoshikawa1106:20190627082018p:plain

Salesforce Developers


特定のデータが2件以上存在するデータの抽出はレポートのサマリレポートでレコード順で並び替える方法で対応するこことができたのでよく使ってました。

f:id:tyoshikawa1106:20190627074929p:plain


関係無いデータも表示されますが一旦必要なデータが上の方に集まります。
f:id:tyoshikawa1106:20190627075041p:plain


重複判定に使いたいキーワードを持つ項目をサマリ項目に指定してレコード件数の多い順に並び替えることで重複データの有無をチェックしていたのですが組織に登録されたレコード件数自体が多くなると並び替え時にエラーとなり、この方法での重複データの確認はできなくなりました。


別の抽出方法を探していたところ、Trailblazer CommunityでHAVINGクエリをつかった方法が紹介されているのを見つけたので試したところ無事に必要なデータの抽出がうまくいきました。

Trailblazer Community - 質問広場


同じ取引先IDを持つ商談が2件以上存在しているデータの抽出するときのサンプルです。(※取引先と商談の場合は実際は積み上げ集計で取得可能ですが正しく取得できていることをわかりやすいのでこの条件で試しています。)


まず取引先と商談件数の登録状況です。
f:id:tyoshikawa1106:20190627080611p:plain


同じ取引先IDを持つ商談の件数の取得までならGROUP BYクエリで対応できます。(WHEREもORDER BYも使えます。)

SELECT AccountId,Account.Name,COUNT(Id) FROM Opportunity WHERE AccountId != null GROUP BY AccountId,Account.Name ORDER BY COUNT(Id) DESC

f:id:tyoshikawa1106:20190627081138p:plain


上記のクエリにHAVINGクエリを追加することで2件以上存在するデータという形で絞り込みできます。
→ HAVING COUNT(Id) > 1

SELECT AccountId,Account.Name,COUNT(Id) FROM Opportunity WHERE AccountId != null GROUP BY AccountId,Account.Name HAVING COUNT(Id) > 1 ORDER BY COUNT(Id) DESC

f:id:tyoshikawa1106:20190627081427p:plain


開発者コンソールでの実行となりますので管理者向けの確認方法となりますがこんな感じで特定の条件に一致するデータが2件以上のデータを抽出することができます。サンプルでは取引先IDとしていますが重複判定の項目に差し替えれば重複データの抽出が可能です。

関連