メインコンテンツへスキップ
見出し画像
Photo bydaisaw33

【第153回】 SQL を使って縦持ちのデータを横持ちのデータに変換する方法

    Nobuyuki Watanabe

    Salesforce Marketing Cloud のデータエクステンションに格納されているデータにおいて「縦持ちのデータを横持ちのデータに変換したい」場合の SQL の書き方を記事にしたいと思います。

    ※ Marketing Cloud SQL は「SQL Server」の機能に基づきます。

    今回の事例としては、購読者が飼っているペットごとのデータが格納されている「Pet_Data」データエクステンションの中から、ペット名の後ろに、それぞれ「ちゃん」を付けて、カンマ区切りの横持ち表示をさせてみます。

    さらに、犬と猫で分けて表示を行い、デフォルト値として犬側が NULL の場合は「ワンちゃん」、猫側が NULL の場合は「ネコちゃん」と入力します。

    まず、Pet_Data データエクステンションの中身は下記のような形とします。

    画像

    この登録の状況を整理しておきますと、下記のような形となっています。

    Contact_1 は、犬が2頭 登録されている
    Contact_2 は、犬が1頭 と 猫が1頭 登録されている
    Contact_3 は、猫が2頭 登録されている

    これを変換して、最終的には下記のように格納したいと思います。

    画像

    では、今回の SQL クエリは以下のような形となります。少し理解しづらいかもしれませんが、上のデータエクステンションの項目名と照らし合わせながら、コードを読み解いてみてください。

    SELECT DISTINCT a.Id AS [Id],
        CASE WHEN LEFT(Dog.Name, LEN(Dog.Name) - 1) IS NULL THEN 'ワンちゃん' ELSE LEFT(Dog.Name, LEN(Dog.Name) - 1) END AS [Dog_Name],
        CASE WHEN LEFT(Cat.Name, LEN(Cat.Name) - 1) IS NULL THEN 'ネコちゃん' ELSE LEFT(Cat.Name, LEN(Cat.Name) - 1) END AS [Cat_Name]
    FROM Pet_Data a
    CROSS APPLY (
        SELECT DISTINCT CONCAT(b.Name, 'ちゃん') + '、'
        FROM Pet_Data b
        WHERE a.Id = b.Id
            AND b.Animal_Type = '犬'
        FOR XML PATH('')
    ) Dog(Name)
    CROSS APPLY (
        SELECT DISTINCT CONCAT(b.Name, 'ちゃん') + '、'
        FROM Pet_Data b
        WHERE a.Id = b.Id
            AND b.Animal_Type = '猫'
        FOR XML PATH('')
    ) Cat(Name)

    LEFT(Pet.Name, LEN(Pet.Name) - 1) の箇所は、最後に付いてしまう余計な「、」を削除する働きをしています。


    今回のように、名前の後ろに「ちゃん」をつけたり、犬と猫のような出し分けが無ければ、このコードはもっとシンプルになります。汎用的なコードサンプルとして、以下を記載しておきます。XXX の部分はそのままでも良いですし、分かりやすい名前に変更しても OK です。

    SELECT DISTINCT a.Id,
        LEFT(XXX.FieldName, LEN(XXX.FieldName) - 1) as [FieldName]
    FROM DataExtensionName a
    CROSS APPLY (
        SELECT DISTINCT b.FieldName + '、'
        FROM DataExtensionName b
        WHERE a.Id = b.Id
        FOR XML PATH('')
    ) AS XXX(FieldName)
    画像

    ちなみに、カンマ区切りの横持ちのデータを縦持ちに変換する SQL をお探しの場合は、Salesforce MVP のズザンナ・ヤルチンスカさんのブログにそのサンプルコードが記載されています。記載されている 2 つの解決策のうち、「Solution 2: Cross Apply with XML」の方が使い易いとは思います。

    今回は以上です。


    次の記事はこちら

    前回の記事はこちら

    私の note のトップページはこちら

     
     
     
    Salesforce Marketing Cloud、Agentforce、Data Cloud、Salesforce 認定資格に関する実践的な情報を発信しています。これらの記事が、皆さまの学習や日々の業務に少しでもお役に立てば幸いです。