Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server中以逗号分隔的值返回重复项_Sql_Sql Server_Ssrs 2008 - Fatal编程技术网

SQL Server中以逗号分隔的值返回重复项

SQL Server中以逗号分隔的值返回重复项,sql,sql-server,ssrs-2008,Sql,Sql Server,Ssrs 2008,我正在编写一条语句,根据列的唯一ID值创建一个以逗号分隔的列值列表。某些ID具有多个电子邮件值 我有一个ID、电子邮件、摘要列 例如: ID | Summary | Email ---+---------+---------------- 1 | Hi | abc@gmail.com 1 | Hi | def@gmail.com 2 | good | xyz@gmail.com 通过阅读大量文章和堆栈溢出问题,我尝试了以下方法: SELECT STUF

我正在编写一条语句,根据列的唯一ID值创建一个以逗号分隔的列值列表。某些ID具有多个电子邮件值

我有一个
ID、电子邮件、摘要

例如:

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
我正在寻找的解决方案应返回以下数据:

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/摘要,而不是电子邮件

示例

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
返回

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

内部的
独立的
将防止同一封电子邮件在列表中多次出现。外部的
分组依据
将根据其相应的
ID对电子邮件列表进行分组
摘要

,这不是您在初次尝试时通过电子邮件分组的问题吗?您应该按ID和摘要进行分组