微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

T-SQL - 使用 STUFF 连接分组列并删除重复项

如何解决T-SQL - 使用 STUFF 连接分组列并删除重复项

我有一张看起来像这样的表格:

EmailAddress: nvarchar(255)
MarketingEmailOptIn: nvarchar(50)
NewsletterOptIn: nvarchar(50)
ThoughtleaderOptIn: nvarchar(50)

enter image description here

下面显示的我的 sql 语句采用上面的数据并使用逗号作为分隔符连接“订阅类型”:

SELECT  
    EmailAddress,STUFF((SELECT ',' + 
              CASE
                 WHEN B.MarketingEmailOptIn = 'TRUE' THEN 'MarketingEmail' 
                 WHEN B.ThoughtleaderOptIn = 'TRUE' THEN 'Thoughtleader'
                 WHEN B.NewsletterOptIn = 'TRUE' THEN 'Newsletter'
              END
          FROM UK_AGT_AgentForms_TEST_DE B 
          WHERE ISNULL(B.EmailAddress,'') = ISNULL(A.EmailAddress,'')
          FOR XML PATH('')),1,2,'') AS Subscriptions
FROM
    UK_AGT_AgentForms_TEST_DE A
GROUP BY 
    EmailAddress 

运行此 sql 会产生以下输出

enter image description here

但是请注意,MarketingEmail 列出了两次,因为源表还列出了两次(第一行和第二行)。我需要省略检测到的任何重复项,以便我的结果表看起来像:

enter image description here

我对 STUFF 关键字很陌生。我只是有点迷失在如何在运行时检测重复项 - 感谢任何建议。谢谢

解决方法

尝试这样的事情:

DECLARE @Data table (
    EmailAddress nvarchar(255),MarketingEmailOptIn nvarchar(50),NewsletterOptIn nvarchar(50),ThoughtLeaderOptIn nvarchar(50)
);

INSERT INTO @Data VALUES
    ( 'mike@mikemarks.com','TRUE',NULL,NULL ),( 'mike@mikemarks.com','TRUE' );

SELECT
    EmailAddress,STUFF ( ( CASE WHEN EOptIn = 'TRUE' THEN ',MarketingEmail' ELSE '' END
        + CASE WHEN NOptIn = 'TRUE' THEN ',Newsletter' ELSE '' END
        + CASE WHEN TOptIn = 'TRUE' THEN ',ThoughtLeader' ELSE '' END 
    ),1,'' ) AS Subscriptions
FROM (

    SELECT TOP 100 PERCENT
        EmailAddress,MAX ( MarketingEmailOptIn ) AS EOptIn,MAX ( NewsletterOptIn ) AS NOptIn,MAX ( ThoughtLeaderOptIn ) AS TOptIn
    FROM @Data A --UK_AGT_AgentForms_TEST_DE
    GROUP BY EmailAddress
    ORDER BY EmailAddress

) AS x
ORDER BY 
    EmailAddress;

退货

+--------------------+-----------------------------------------+
|    EmailAddress    |              Subscriptions              |
+--------------------+-----------------------------------------+
| mike@mikemarks.com | MarketingEmail,Newsletter,ThoughtLeader |
+--------------------+-----------------------------------------+
,

如果您有 Sql Server 2017 或更高版本,您可以使用 String_agg() 来简化:

SELECT   
    EmailAddress,STRING_AGG(CASE
                 WHEN MarketingEmailOptIn = 'TRUE' THEN 'MarketingEmail' 
                 WHEN ThoughtLeaderOptIn = 'TRUE' THEN 'ThoughtLeader'
                 WHEN NewsletterOptIn = 'TRUE' THEN 'Newsletter'
              END,',') AS Subscriptions
FROM
    UK_AGT_AgentForms_TEST_DE
GROUP BY 
    EmailAddress

如果您仍然看到重复,您可以在嵌套查询中使用条件聚合先将其汇总:

SELECT  
    EmailAddress,CASE WHEN MarketingEmailOptIn > 0 THEN 'MarketingEmail,' ELSE '' END
        + CASE WHEN ThoughtLeaderOptIn > 0 THEN 'ThoughtLeader,' ELSE '' END
        + CASE WHEN NewsletterOptIn = > 0 THEN 'Newsletter' ELSE '' END
         AS Subscriptions
FROM (
    SELECT EmailAddress,SUM(CASE WHEN MarketingEmailOptIn = 'TRUE' THEN 1 ELSE 0 END) MarketingEmailOptIn,SUM(CASE WHEN ThoughtLeaderOptIn = 'TRUE' THEN 1 ELSE 0 END) ThoughtLeaderOptIn,SUM(CASE WHEN NewsletterOptIn = 'TRUE' THEN 1 ELSE 0 END) NewsletterOptIn
    FROM UK_AGT_AgentForms_TEST_DE
    GROUP BY EmailAddress
) T
,

皮尤。我不得不玩这个。也许不是完美的解决方案,但我认为我能够实现您的尝试。虽然它不使用东西功能。它只是连接每个字符串,然后删除最后一个逗号。

SELECT EmailAddress,CASE WHEN LEN(Subscriptions) > 0 THEN LEFT(Subscriptions,LEN(Subscriptions) - 1) ELSE '' END AS Subscriptions
FROM (
    SELECT EmailAddress,CONCAT(
            CASE WHEN SUM(CASE WHEN MarketingEmailOptIn = 'TRUE' THEN 1 ELSE 0 END) > 0 THEN 'MarketingEmail,' ELSE '' END,CASE WHEN SUM(CASE WHEN NewsletterOptIn = 'TRUE' THEN 1 ELSE 0 END) > 0 THEN 'Newsletter,CASE WHEN SUM(CASE WHEN ThoughtLeaderOptIn = 'TRUE' THEN 1 ELSE 0 END) > 0 THEN 'ThoughLeader,' ELSE '' END
        ) AS Subscriptions
    FROM UK_AGT_AgentForms_TEST_DE 
    GROUP BY EmailAddress
) AS a

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。