Adobe Campaignクエリー道場(7)〜CASE式で集計

[前回](https://qiita.com/JJSlider/items/c85ed2abf4e836daaa7a "Adobe Campaignクエリー道場(6)〜CASE式で推し活?!")までAdobe CampaignクエリーにおけるCASE式をとりあげました。カラムを別なかたちに変換できる優れものでしたね。
今回はそのCASE式で集計を行うことを考えましょう。
[前々回](https://qiita.com/JJSlider/items/db2ce04818871cf435c5 "Adobe Campaignクエリー道場(5)〜CASE式はシティポップに乗せて")では、受信者を誕生日の元号でラベリングしました。ではその元号別に人数を集計するにはどうしたらいいでしょうか。今回は、CASE式を使ってその要件を解決してみます。

::: note
誕生日が1926年12月26日以降の受信者で「昭和生まれ」「平成生まれ」「令和生まれ」それぞれの人数を数えたい。
:::

例によって「クエリ」アクティビティを作成。「受信者」をディメンジョンとし、フィルター条件を「誕生日」が1926年12月26日「以降」とします:
![2023-11-30_11-48-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/fa771d6e-7fa8-07dc-aeed-be25869d5f9a.png)
「クエリ」画面で「データを追加...」。「追加するデータ」画面まで[前々回](https://qiita.com/JJSlider/items/db2ce04818871cf435c5 "Adobe Campaignクエリー道場(5)〜CASE式はシティポップに乗せて")と同手順で進みます。そして「出力列」で「追加」ボタンをクリック:
![2023-11-30_11-50-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/858bd8bd-8bc1-40f1-f1b7-a5ecb47011ee.png)
「式」に以下をコピペしてください:
```
Sum(Case(When(@birthDate<'1989/01/08', 1), Else(0)))
```
そして「ラベル」に「昭和」と入力[^1]:
![2023-11-30_12-10-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/4763348c-1dbb-4ace-f07d-46dbd4651a61.png)
ふたたび「追加」をクリック、あらたな行に以下をコピペ:
```
Sum(Case(When(@birthDate<'2019/05/01' and @birthDate>='1989/01/08', 1), Else(0)))
```
「ラベル」に「平成」と入力:
![2023-11-30_12-18-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/4519fcfe-17dc-5a6b-bcd0-511133803054.png)
もういちど「追加」をクリック、あらたな行に以下をコピペ:
```
Sum(Case(When(@birthDate>='2019/05/01', 1), Else(0)))
```
「ラベル」に「令和」と入力:
![2023-11-30_12-25-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/604e65b7-7281-06d0-6d4f-2f945b68441a.png)
いったん「完了」で「クエリ」画面に戻り、「追加データを編集...」をクリック:
![2023-11-30_12-29-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/dce40468-a859-e29c-f451-8de9c322870a.png)
「詳細設定パラメーター」画面で「重複行を削除」をアンチェック、「ターゲティングディメンジョンのプライマリキーの自動追加を無効にする」をチェック[^2]:
![2023-11-30_12-33-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/2b253aac-7dcb-42b1-e159-9e8a448ad19b.png)
「OK」３回クリックでワークフローキャンバスに戻って「保存」、完成です。実行し「クエリ」アクティビティからの遷移矢印を右クリックして「ターゲットを表示...」:
![2023-11-30_12-51-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516149/1b14772f-e0c3-5b0d-60d2-0d9caf88c60d.png)
元号別の人数が得られました！
***
式の意味を振り返ってみましょう。
```
Sum(Case(When(@birthDate<'1989/01/08', 1), Else(0)))
```
「Case()」「When()」「Else()」は[前回](https://qiita.com/JJSlider/items/c85ed2abf4e836daaa7a "Adobe Campaignクエリー道場(6)〜CASE式で推し活?!")・[前々回](https://qiita.com/JJSlider/items/db2ce04818871cf435c5 "Adobe Campaignクエリー道場(5)〜CASE式はシティポップに乗せて")から紹介しているCampaignの関数ですね。今回は何をしているかというと:
```
When(@birthDate<'1989/01/08', 1)
```
このWhen()関数ではまず、誕生日が1989年1月8日より前という条件を指定しています。そしてレコード行が同条件に合致したならば「1」を値として返します。これにより、誕生日が昭和の受信者に「1」という値が与えられるのです。続いて:
```
Else(0)
```
Else()関数は、先行するWhen()関数の条件以外であればカッコ内の値を返すもの。とするとこの場合、誕生日が昭和でないならば「0」ということですね。以上をCase()関数でまとめると:
```
Case(When(@birthDate<'1989/01/08', 1), Else(0))
```
誕生日が昭和なら「1」、そうでなければ「0」、という値が受信者に割り振られるわけです。そして最後に:
```
Sum(Case(When(@birthDate<'1989/01/08', 1), Else(0)))
```
Case()全体をSum()で囲いました。[過去回](https://qiita.com/JJSlider/items/dff8bb8a8c48ddad40bf "Adobe Campaignクエリー道場(1)〜ユニークな件数")で「[集計関数](https://experienceleague.adobe.com/docs/campaign-standard/using/managing-processes-and-data/filtering-data/list-of-functions.html?lang=ja#aggregates)」を紹介していますが、このSum()も集計関数のひとつ。カッコ内を合計した値を返すものです。
誕生日が昭和なら１、そうでないなら０を合計する──とすると、昭和生まれの人数が得られるというわけですね！
あとは同様に:
```
Sum(Case(When(@birthDate<'2019/05/01' and @birthDate>='1989/01/08', 1), Else(0)))
```
は誕生日が平成の人数の合計、
```
Sum(Case(When(@birthDate>='2019/05/01', 1), Else(0)))
```
は誕生日が令和の合計となります。
***
いかがでしたか。CASE式で母集団からの条件つき集計を取ることができました。SQLの世界ではおなじみのテクニックですが、Campaignでこれがさらっとできるようになると、打てる施策の幅が広がりますね。ぜひ身につけて、日々のキャンペーンに活かしてください！

::: note warn
本稿の内容は筆者のオンプレミス型デモ環境(Adobe Campaign Classic 9359@c636bf3 PostgreSQL 14.9)上で実施した検証に基づきます。別環境における同様の動作を保証するものではありません。またデータは架空のものであり、既存の配信や実在の組織とはいっさい関係がありません。
:::
[^1]: 「式」の画面表示は、Campaignが「Sum(...)」を認識し「...の合計」と自動的に変換します。
[^2]: [集計関数](https://experienceleague.adobe.com/docs/campaign-standard/using/managing-processes-and-data/filtering-data/list-of-functions.html?lang=ja#aggregates)を使うために大事な設定です。[過去回](https://qiita.com/JJSlider/items/dff8bb8a8c48ddad40bf "Adobe Campaignクエリー道場(1)〜ユニークな件数")参照。