选择多个具有匹配ID的行

时间:2018-12-10 12:28:26

标签: sql sql-server tsql

我尝试了几个小时,读了很多帖子,但仍然不知道如何处理此请求:

我有一张这样的桌子:

+------+------+
|roleid|comid |
+------+------+
|11    | A    |
+------+------+
|12    | A    |
+------+------+
|11    |B     |
+------+------+
|12    |B     |
+------+------+
|13    |B     |
+------+------+

我想选择使用不同comid多次出现的角色ID。

我想输出的内容应该是这样的:

+------+------+
|roleid|comid |
+------+------+
|11    |A,B   |
+------+------+
|12    |A,B   |
+------+------+
|13    |B     |
+------+------+

2 个答案:

答案 0 :(得分:1)

只需将STUFF()FOR XML PATH('')函数一起使用

SELECT roleid,
       STUFF(
         (
           SELECT ',' + comid
           FROM T
           WHERE roleid = T1.roleid
           FOR XML PATH('')
         ), 1, 1, ''
       ) comid 
FROM T T1
GROUP BY roleid

Demo

答案 1 :(得分:1)

如果您使用的SQL Server版本大于或等于2017,则还可以使用STRING_AGG函数,并仅采用具有多个不同roleid的那些comid使用HAVING日历:

SELECT roleid,
       STRING_AGG(comid, ',')
FROM T
GROUP BY roleid
HAVING COUNT(DISTINCT comid) > 1