前回までAdobe CampaignクエリーにおけるCASE式をとりあげました。カラムを別なかたちに変換できる優れものでしたね。
今回はそのCASE式で集計を行うことを考えましょう。
前々回では、受信者を誕生日の元号でラベリングしました。ではその元号別に人数を集計するにはどうしたらいいでしょうか。今回は、CASE式を使ってその要件を解決してみます。
誕生日が1926年12月26日以降の受信者で「昭和生まれ」「平成生まれ」「令和生まれ」それぞれの人数を数えたい。
例によって「クエリ」アクティビティを作成。「受信者」をディメンジョンとし、フィルター条件を「誕生日」が1926年12月26日「以降」とします:
「クエリ」画面で「データを追加...」。「追加するデータ」画面まで前々回と同手順で進みます。そして「出力列」で「追加」ボタンをクリック:
「式」に以下をコピペしてください:
Sum(Case(When(@birthDate<'1989/01/08', 1), Else(0)))
そして「ラベル」に「昭和」と入力1:
ふたたび「追加」をクリック、あらたな行に以下をコピペ:
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)))
「ラベル」に「令和」と入力:
いったん「完了」で「クエリ」画面に戻り、「追加データを編集...」をクリック:
「詳細設定パラメーター」画面で「重複行を削除」をアンチェック、「ターゲティングディメンジョンのプライマリキーの自動追加を無効にする」をチェック2:
「OK」3回クリックでワークフローキャンバスに戻って「保存」、完成です。実行し「クエリ」アクティビティからの遷移矢印を右クリックして「ターゲットを表示...」:
元号別の人数が得られました!
式の意味を振り返ってみましょう。
Sum(Case(When(@birthDate<'1989/01/08', 1), Else(0)))
「Case()」「When()」「Else()」は前回・前々回から紹介している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()で囲いました。過去回で「集計関数」を紹介していますが、このSum()も集計関数のひとつ。カッコ内を合計した値を返すものです。
誕生日が昭和なら1、そうでないなら0を合計する──とすると、昭和生まれの人数が得られるというわけですね!
あとは同様に:
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でこれがさらっとできるようになると、打てる施策の幅が広がりますね。ぜひ身につけて、日々のキャンペーンに活かしてください!
本稿の内容は筆者のオンプレミス型デモ環境(Adobe Campaign Classic 9359@c636bf3 PostgreSQL 14.9)上で実施した検証に基づきます。別環境における同様の動作を保証するものではありません。またデータは架空のものであり、既存の配信や実在の組織とはいっさい関係がありません。