【问题标题】:Comma separated values in SQL Server returning duplicatesSQL Server 中的逗号分隔值返回重复项
【发布时间】:2018-09-01 03:14:45
【问题描述】:

我正在编写一个语句,以根据其唯一 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

解决方案我正在寻找应该返回此数据:

ID | Summary | Email
---+---------+------------------------------
1  | Hi      | abc@gmail.com, def@gmail.com
2  | good    | xyz@gmail.com

我可以做些什么来改进我的查询,还是我完全转向了错误的方向?

【问题讨论】:

  • 是不是你一开始是按Email分组的问题?您应该按 ID 和摘要分组

标签: sql sql-server ssrs-2008


【解决方案1】:

看来您应该关闭 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

【讨论】:

    【解决方案2】:

    我想你只需要改变这个:

    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
    

    【讨论】:

      【解决方案3】:

      看来你想要这个:

      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 将根据其对应的IDSummary 对电子邮件列表进行分组

      【讨论】:

        猜你喜欢
        • 2011-12-27
        • 2012-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-12
        • 2012-09-08
        相关资源
        最近更新 更多