CRMAで選択した日付と一年前の日の金額を比較するテーブルの作成方法

この方法がSalesforce official blog [One date widget, two date filters, plus an offset](https://www.salesforceblogger.com/2022/03/03/one-date-widget-two-date-filters-plus-an-offset/)を参考しました。詳細をsalesforce official blog内容ををご参照ください。


## 目的
以下のビジネス分析で頻繁に使用される質問に答えるため：
**一つの日付ウィジェットを使い、その結果を一つのメジャーに適用しつつ、一年前の日付を引いてもう一つのメジャーに適用する方法は？**

## 成果物
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/f94f3bd8-b2ec-2016-4627-ae68ae9d1318.png)


## 手順
### 1.テーブル比較の作成

二つの金額の列を作成してください。必要なグループ化単位を設定してください。

一つの列に「完了予定日」の条件をつけて、適当な日付を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/b0bbe318-7578-dcf3-4c85-20dc70deab0b.png)


もう一つの列には適当な基準項目を利用して条件を設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/77f6a950-0295-7e38-0993-37a9e202d127.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/003a8d79-db19-805e-eed8-e846b85e1445.png)

分かりやすくするために、列名を編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/15efd42c-a404-deeb-b3ce-de9f75217aed.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/1f0275bb-5b5b-65f1-d372-a3fb663681e5.png)


### 2.テーブル比較のクエリを編集
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/691fed84-dfab-4189-cb73-c1fe4b3c3bff.png)

**SAQL編集前**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/f88a1d8f-12da-db76-e551-49fbc5ff46ed.png)

**SAQL編集前後**
・列「マイナス一年」の条件を日付項目「CloseDate」の秒のバージョンに変更しました。
・SAQLで列名を再度定義しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/d66ec9f2-490a-6c0f-3041-53ba253cb221.png)

※CRMAの日付項目の形式を理解したい場合、以下の内容をご参照ください。
[Demystifying Dates in Recipes](https://www.salesforceblogger.com/2022/03/18/demystifying-dates-in-recipes/)

### 3.日付フィルターの配置
日付ウィジェットを利用して、CloseDateのフィルターを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/6e2e08b4-d8cf-5f0d-637e-230944c8a265.png)

テーブル比較を日付ウィジェットのファセット機能からクエリを除外します。そうしないと、この日付フィルターを使用する際に、テーブル比較の両方の列に影響が及びます。まず日付フィルターによる影響を排除し、次にインタラクションを使用して、選択したデータの列に日付フィルターの影響が及ぶようにします。

テーブル比較をクリックし、クエリのファセットからCloseDateフィルターを除外します。
設定後、プレビューで日付フィルターの内容を絞り込んでください。テーブルに影響がないことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/a73b3c30-860b-16f8-9247-f6d39bf84cd0.png)


### 4.日付の計算
インタラクション式を作る前に、隠されたステップで計算を行う必要があります。同じデータセットを利用してクエリを作成し、SAQLに直接切り替えます。以下のコードをSAQLに貼り付けてください。
クエリに名前をつけてください。例：date offset calculation

```q = foreach q generate min(CloseDate_sec_epoch) - (case 
        when toString(toDate(min(CloseDate_sec_epoch) - 365*24*3600), "dd")  == toString(toDate(min(CloseDate_sec_epoch)), "dd") then 365 
        else 366 
        end) 
    *24*3600 as 'min', max(CloseDate_sec_epoch) - (case 
        when toString(toDate(max(CloseDate_sec_epoch) - 365*24*3600), "dd")  == toString(toDate(max(CloseDate_sec_epoch)), "dd") then 365 
        else 366 
        end) 
    *24*3600 as 'max';
```
コードの説明：
```
-- 最小のClose Dateを取得し、case文の値を引く
min(CloseDate_sec_epoch) - 
   (case 
-- 365日を引いて現在の年と比較し、同じ値ならうるう年ではないので365を返す
      when toString(toDate(min(CloseDate_sec_epoch) - 365*24*3600), "dd") == toString(toDate(min(CloseDate_sec_epoch)), "dd") then 365 
-- うるう年なら366を返す
      else 366 
      end) 
-- 1年の秒数を計算する
    *24*3600 
as 'min',
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/2553b0c1-d16f-3b75-1382-2351ce0380ad.png)

### 5.インタラクション式

テーブル比較をクリックし、advanced editor(高度なエディター)を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/9c5e1a94-9632-d10c-08eb-44d4689a03e9.png)

クエリのところでq_Aのクエリにインタラクション式を入れ替えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/087ea1a3-dc03-9ec0-de02-403ccc5f59de.png)

```
q_A = filter q by {{row(CloseDate_1.selection, [0], [\"min\", \"max\"]).asDateRange(\"date('CloseDate_Year', 'CloseDate_Month', 'CloseDate_Day')\")}};
```
※CloseDate_1を自身で使用した日付フィルターのAPI名に変更してください。
[参考情報] API名の調べ方：インタラクションエディターを利用して、ソースクエリから日付フィルターを選択し、画面の下にある「作成されたインタラクション」からAPI名をコピーできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/719e85bf-5ef0-275a-1ed4-d31056570885.png)



The second filter that will be showing the selected date range minus one year will be powered by the hidden query or step.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/7bad20d3-0beb-ebbc-ef53-75a46023031a.png)
```
q_B = filter q by {{row(dateOffset_1.result, [0], [\"min\", \"max\"]).asRange(\"CloseDate_sec_epoch\")}};
```
※CloseDate_1を自身で作成した隠しクエリのAPI名に変更してください。。


完成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/1a9d8682-b695-e382-aa7f-bae8a23c0b93.png)


プレビューで試してみてください！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672646/8bcbd4c4-34c1-8021-df5a-2a06f12ce5e0.png)



**参考資料**
[CRM Analytics Interactions](https://developer.salesforce.com/docs/analytics/bi-dev-guide-bindings/overview)