【发布时间】:2021-07-01 13:37:28
【问题描述】:
我有一张如下所示的表格:
EmailAddress: nvarchar(255)
MarketingEmailOptIn: nvarchar(50)
NewsletterOptIn: nvarchar(50)
ThoughtLeaderOptIn: nvarchar(50)
下面显示的我的 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 会产生以下输出:
但是请注意,MarketingEmail 被列出了两次,因为源表也列出了两次(第 1 行和第 2 行)。我需要省略检测到的任何重复项,以便生成的表如下所示:
我对 STUFF 关键字很陌生。我只是有点迷失如何在运行时检测重复项 - 任何建议都值得赞赏。谢谢
【问题讨论】:
-
您使用的是什么版本的 SQL Server?
-
当
varchar(5)足够时,为什么最后3 列和nvarchar(50)就足够了? -
@Larnu 不知道。不幸的是,我不能随意更改数据结构。
-
也许将 FROM UK_AGT_AgentForms_TEST_DE B 替换为 FROM (SELECT DISTINCT * FROM UK_AGT_AgentForms_TEST_DE) B?
-
我认为
string_agg()可能更适合您,如果您可以使用的话。
标签: sql-server tsql stuff