sql-server - T-SQL - 使用 STUFF 连接分组列并删除重复项
问题描述
我有一个看起来像这样的表:
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
关键字很陌生。我只是有点迷失如何在运行时检测重复项 - 任何建议都值得赞赏。谢谢
解决方案
尝试这样的事情:
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', 'TRUE', NULL ),
( 'mike@mikemarks.com', 'TRUE', NULL, '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, 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 |
+--------------------+-----------------------------------------+
推荐阅读
- websphere - IBM ODM 相关 XOM 类
- c# - 如何在 C# net core 中从数据库中获取数据
- python - Python:用多个值替换单个字符
- user-interface - 如何为 Spark AR 创建 UI?
- javascript - JS 文档帮助。文档事件监听器
- jsf - 选择一个panelGrid并设置对象
- java - 如何使用 jOOQ gradle 插件将 postgres 中的 bigint[] 字段转换为类字段
- firebase - 无法向 Firebase 远程配置添加值/参数
- python - CNN 中图像二进制分类的 50% 准确率
- android-studio - 我如何表示行中的两个文本字段