SQL group by with combine,用于查找分隔字符串

时间:2017-05-02 15:20:39

标签: sql-server-2012 group-by delimited-text

我在尝试解析一组数据时遇到问题,这些数据包含一个或多个值的列,这些值由";"组合而成。这是一个示例(记住我没有设置这个数据配置,我只需要处理它):

Create Table #testData
(
    team varchar(20),
    sdate datetime,
    unqKeys varchar(max)
)

Insert Into #testData values ('1','2/1/2017','abcd123;qazwsx123');
Insert Into #testData values ('1','2/1/2017','qweasd123');
Insert Into #testData values 
('1','3/1/2017','qweasd123;564plmnko;poilkj765');
Insert Into #testData values ('2','2/1/2017','ug56ogth4;uhntg456f');
Insert Into #testData values ('2','4/1/2017','fghrty987');
Insert Into #testData values ('2','4/1/2017','ertdfg546;werstf234;qweasd123');

Select * From #testData

我需要看到的是[team]在[unqKeys]列中具有重复值的位置。我曾尝试在unqKeys上使用COALESCE,但我无法按团队对它们进行分组。我需要一种方法来组合一个团队的所有unqKeys,然后逐步检查列表检查重复项。由于这是SQL Server 2012,我没有split_string功能,但我确实试图使其成功,但我仍然没有将它们与团队ID相结合。

在上面的例子中,我需要看到一个积极的发现:

team | dupKeys
----   -------
1      qweasd123

这是因为unqKey存在于不同团队的多个记录中。

我已经尝试选择团队并合并unqKey但是这会因为组合的unqKey不是聚合的一部分而失败,如果添加,我只是得到结果,就像你在示例中看到的那样。我试图使用我的分割功能,但后来我失去了与团队的关联,但得到了一个包含所有unqKeys的表。

使用@xQbert评论和链接的解决方案:

--Shows the data
Select * From #testData

--Showing the failure
Select Distinct b.team, b.uKey as dupKey from (
    Select a.team
          ,split.a.value('.','nvarchar(50)') as uKey
    From (
        Select team
              ,Cast('<u>' + REPLACE(unqKeys, ';','</u><u>') + '</u>' as XML) as uKey
    From #testData
    ) as a CROSS APPLY uKey.nodes ('/u') as split(a)
) as b
Group By b.team, b.uKey
Having Count(*) > 1

Data Output in SSMS 2016

0 个答案:

没有答案