SQL 服务器返回重复项中的逗号分隔值
Comma separated values in SQL Server returning duplicates
我正在编写一个语句,以根据其唯一 ID 值创建一个以逗号分隔的列值列表。一些 ID 有多个电子邮件值。
我有 ID, Email, Summary
列。
例如:
ID | Summary | Email
---+---------+----------------
1 | Hi | abc@gmail.com
1 | Hi | def@gmail.com
2 | good | xyz@gmail.com
看了一堆文章和堆栈溢出问题,我试了这个:
SELECT
STUFF((SELECT ', ' + cr.Email AS [text()]
FROM Table1 cr1
WHERE cr1.Email = cr.Email
FOR XML PATH('')), 1, 1, '') AS List
FROM
Table1 cr
GROUP BY
cr.Email
上述查询的问题是,它向我显示了电子邮件,但它们都是重复的。例如:
ID | Summary | Email
---+---------+---------------------------------------------
1 | Hi | abc@gmail.com
1 | Hi | def@gmail.com, def@gmail.com, def@gmail.com
2 | good | xyz@gmail.com, xyz@gmail.com
所以我尝试了一种不同的方法,
DECLARE @tmp VARCHAR(250)
SET @tmp = ''
SELECT @tmp = @tmp + cr.Email + ', '
FROM Table1 cr
SELECT
SUBSTRING(@tmp, 0, LEN(@tmp))
上述查询的问题 是,它以逗号分隔列表显示每封电子邮件。因此,具有唯一 ID 的每一行都包含
中的所有电子邮件
ID | Summary | Email
---+---------+--------------------------------------------
1 | Hi | abc@gmail.com, def@gmail.com, xyz@gmail.com
2 | good | abc@gmail.com, def@gmail.com, xyz@gmail.com
解决方法我要找的应该是return这个数据:
ID | Summary | Email
---+---------+------------------------------
1 | Hi | abc@gmail.com, def@gmail.com
2 | good | xyz@gmail.com
我可以做些什么来改进我的查询,还是我完全转向了错误的方向?
我想你只需要改变这个:
select
STUFF((SELECT ', ' + cr.Email AS [text()]
FROM Table1 cr1
where cr1.Email = cr.Email
FOR XML PATH('')), 1, 1, '') AS List
FROM Table1 cr
GROUP BY cr.Email
为此:
select
STUFF((SELECT ', ' + cr.Email AS [text()]
FROM Table1 cr1
where cr1.Email = cr.Email
FOR XML PATH('')), 1, 1, '') AS List
FROM Table1 cr
GROUP BY cr1.ID, cr1.Summary
看来您应该关闭 ID/Summary 而不是电子邮件
例子
Declare @YourTable Table ([ID] int,[Summary] varchar(50),[Email] varchar(50))
Insert Into @YourTable Values
(1,'Hi','abc@gmail.com')
,(1,'Hi','def@gmail.com')
,(2,'good','xyz@gmail.com')
Select A.ID
,A.Summary
,EMail = Stuff((Select Distinct ', ' +EMail From @YourTable Where ID=A.ID and Summary=A.Summary For XML Path ('')),1,2,'')
From @YourTable A
Group By ID,Summary
Returns
ID Summary EMail
1 Hi abc@gmail.com, def@gmail.com
2 good xyz@gmail.com
看来你想要这个:
SELECT cr.ID,
cr.Summary,
STUFF((SELECT DISTINCT ', ' + cr1.Email
FROM Table1 cr1
WHERE cr1.ID = cr.ID
AND cr1.Summary = cr.Summary
FOR XML PATH('')), 1, 1, '') AS List
FROM Table1 cr
GROUP BY cr.ID, cr.Summary
内部 DISTINCT
将防止同一封电子邮件在列表中多次出现。外层 GROUP BY
将根据相应的 ID
和 Summary
对电子邮件列表进行分组
我正在编写一个语句,以根据其唯一 ID 值创建一个以逗号分隔的列值列表。一些 ID 有多个电子邮件值。
我有 ID, Email, Summary
列。
例如:
ID | Summary | Email
---+---------+----------------
1 | Hi | abc@gmail.com
1 | Hi | def@gmail.com
2 | good | xyz@gmail.com
看了一堆文章和堆栈溢出问题,我试了这个:
SELECT
STUFF((SELECT ', ' + cr.Email AS [text()]
FROM Table1 cr1
WHERE cr1.Email = cr.Email
FOR XML PATH('')), 1, 1, '') AS List
FROM
Table1 cr
GROUP BY
cr.Email
上述查询的问题是,它向我显示了电子邮件,但它们都是重复的。例如:
ID | Summary | Email
---+---------+---------------------------------------------
1 | Hi | abc@gmail.com
1 | Hi | def@gmail.com, def@gmail.com, def@gmail.com
2 | good | xyz@gmail.com, xyz@gmail.com
所以我尝试了一种不同的方法,
DECLARE @tmp VARCHAR(250)
SET @tmp = ''
SELECT @tmp = @tmp + cr.Email + ', '
FROM Table1 cr
SELECT
SUBSTRING(@tmp, 0, LEN(@tmp))
上述查询的问题 是,它以逗号分隔列表显示每封电子邮件。因此,具有唯一 ID 的每一行都包含
中的所有电子邮件ID | Summary | Email
---+---------+--------------------------------------------
1 | Hi | abc@gmail.com, def@gmail.com, xyz@gmail.com
2 | good | abc@gmail.com, def@gmail.com, xyz@gmail.com
解决方法我要找的应该是return这个数据:
ID | Summary | Email
---+---------+------------------------------
1 | Hi | abc@gmail.com, def@gmail.com
2 | good | xyz@gmail.com
我可以做些什么来改进我的查询,还是我完全转向了错误的方向?
我想你只需要改变这个:
select
STUFF((SELECT ', ' + cr.Email AS [text()]
FROM Table1 cr1
where cr1.Email = cr.Email
FOR XML PATH('')), 1, 1, '') AS List
FROM Table1 cr
GROUP BY cr.Email
为此:
select
STUFF((SELECT ', ' + cr.Email AS [text()]
FROM Table1 cr1
where cr1.Email = cr.Email
FOR XML PATH('')), 1, 1, '') AS List
FROM Table1 cr
GROUP BY cr1.ID, cr1.Summary
看来您应该关闭 ID/Summary 而不是电子邮件
例子
Declare @YourTable Table ([ID] int,[Summary] varchar(50),[Email] varchar(50))
Insert Into @YourTable Values
(1,'Hi','abc@gmail.com')
,(1,'Hi','def@gmail.com')
,(2,'good','xyz@gmail.com')
Select A.ID
,A.Summary
,EMail = Stuff((Select Distinct ', ' +EMail From @YourTable Where ID=A.ID and Summary=A.Summary For XML Path ('')),1,2,'')
From @YourTable A
Group By ID,Summary
Returns
ID Summary EMail
1 Hi abc@gmail.com, def@gmail.com
2 good xyz@gmail.com
看来你想要这个:
SELECT cr.ID,
cr.Summary,
STUFF((SELECT DISTINCT ', ' + cr1.Email
FROM Table1 cr1
WHERE cr1.ID = cr.ID
AND cr1.Summary = cr.Summary
FOR XML PATH('')), 1, 1, '') AS List
FROM Table1 cr
GROUP BY cr.ID, cr.Summary
内部 DISTINCT
将防止同一封电子邮件在列表中多次出现。外层 GROUP BY
将根据相应的 ID
和 Summary