function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
takutaku 

SQL文のdistinct句と同じ機能

SQL文のdistinct句と同じ機能をSOQL文で書けるでしょうか?

 

例えば、

select distinct name from account

と同じ結果を、

SOQL文で記述できるでしょうか?

 

Best Answer chosen by Admin (Salesforce Developers) 
TylorTylor

「商品名」「社名」「TEL」「FAX」「住所」「代表者名」というテーブル「納品商品」のレコードが以下のようになっている場合、

 

商品A 取引先X 03-XXXX-XXXX 03-XXXX-XXXX 東京都XXXX区 Xさん

商品A 取引先Y 03-YYYY-YYYY 03-YYYY-YYYY 東京都YYYY区 Yさん

商品A 取引先X 03-XXXX-XXXX 03-XXXX-XXXX 東京都XXXX区 Xさん           ←同じ商 品の購入歴

商品A 取引先Z 03-ZZZZ-ZZZZ 03-ZZZZ-XXXX 東京都XXXX区 Zさん

 

Select 「社名」, 「TEL」, 「FAX」, 「住所」, 「代表者名」, count(「商品名」)

from 「納品商品」

where 「商品名」 = '商品A'

group by 「社名」, 「TEL」, 「FAX」, 「住所」, 「代表者名」

 

ってな感じで、実行すると以下の結果が得られます。

 

取引先X 03-XXXX-XXXX 03-XXXX-XXXX 東京都XXXX区 Xさん 2

取引先Y  03-YYYY-YYYY 03-YYYY-YYYY 東京都YYYY区 Yさん 1

取引先Z  03-ZZZZ-ZZZZ 03-ZZZZ-XXXX 東京都XXXX区 Zさん 1

 

ちなみに、APEX CODEで取得する場合は、以下のようになります。

 

for (AggregateResult record : [
select 「社名」, 「TEL」, 「FAX」, 「住所」, 「代表者名」, count(「商品名」) 別名
from 「納品商品」
where 「商品名」 = '商品A'
group by 「社名」, 「TEL」, 「FAX」, 「住所」, 「代表者名」
]) {
System.debug(record.get('「社名」'));
System.debug(record.get('「TEL」'));
System.debug(record.get('「FAX」'));
    System.debug(record.get('「住所」'));
System.debug(record.get('「代表者名」'));
System.debug(record.get('「別名」'));
}
 

 

 

 

 

All Answers

TylorTylor

ver.18.0 より GROUP BY が使用できるようになったので、

DISTINCT と同じ機能として使用できるかと思います。

 

ドキュメントはこちらを参照してください。

 

以上

takutaku

ご返信有難うございます。

 

group byですと、集計はできても、

重複処理には使えないかと思っていました。

重複処理として使う方法があるでしょうか?

 

 

※出したいアウトプットなのですが、

「納入商品が関連する取引先」のようなレポートタイプを使う際に、

「“商品A”を購入したことがある取引先」のリストを出したいと思っています。

 

通常ですと、”商品A”を複数回購入している取引先Bがあると、

「”取引先B”×”商品A”」が複数レコード出てきてしまい、

それを.csv上で処理する形になりますが、それを回避したいと思っています。

 

また、分析・集計のための処理ではなく、

販促リストを抽出するための処理になります。

従って、1つのレコード;”取引先B”に対して、

「社名」「TEL」「FAX」「住所」「代表者名」のように、

複数項目を引っ張りたい感じです。

 

 

初心者のため、的外れな質問をしておりましたら、

申し訳ありません・・・

 

TylorTylor

「商品名」「社名」「TEL」「FAX」「住所」「代表者名」というテーブル「納品商品」のレコードが以下のようになっている場合、

 

商品A 取引先X 03-XXXX-XXXX 03-XXXX-XXXX 東京都XXXX区 Xさん

商品A 取引先Y 03-YYYY-YYYY 03-YYYY-YYYY 東京都YYYY区 Yさん

商品A 取引先X 03-XXXX-XXXX 03-XXXX-XXXX 東京都XXXX区 Xさん           ←同じ商 品の購入歴

商品A 取引先Z 03-ZZZZ-ZZZZ 03-ZZZZ-XXXX 東京都XXXX区 Zさん

 

Select 「社名」, 「TEL」, 「FAX」, 「住所」, 「代表者名」, count(「商品名」)

from 「納品商品」

where 「商品名」 = '商品A'

group by 「社名」, 「TEL」, 「FAX」, 「住所」, 「代表者名」

 

ってな感じで、実行すると以下の結果が得られます。

 

取引先X 03-XXXX-XXXX 03-XXXX-XXXX 東京都XXXX区 Xさん 2

取引先Y  03-YYYY-YYYY 03-YYYY-YYYY 東京都YYYY区 Yさん 1

取引先Z  03-ZZZZ-ZZZZ 03-ZZZZ-XXXX 東京都XXXX区 Zさん 1

 

ちなみに、APEX CODEで取得する場合は、以下のようになります。

 

for (AggregateResult record : [
select 「社名」, 「TEL」, 「FAX」, 「住所」, 「代表者名」, count(「商品名」) 別名
from 「納品商品」
where 「商品名」 = '商品A'
group by 「社名」, 「TEL」, 「FAX」, 「住所」, 「代表者名」
]) {
System.debug(record.get('「社名」'));
System.debug(record.get('「TEL」'));
System.debug(record.get('「FAX」'));
    System.debug(record.get('「住所」'));
System.debug(record.get('「代表者名」'));
System.debug(record.get('「別名」'));
}
 

 

 

 

 

This was selected as the best answer
takutaku

なるほど。

理解できました。

ありがとうございます!!