如何在sql中添加逗号分隔的字符串

时间:2015-11-16 09:50:45

标签: sql sql-server tsql

我有2张表格如下

---------------------------------
| PId |           uniid          |
|-----|------------------------  |
|   1 |      xxxggsgsg           |
|   3 |     xxxxxggsgs           |
|   4 |     xxxxxggsgsg          |
|   5 |         gfgjsfgjf        |
|   6 |      gsgjsfgjf           |
|   7 |        gfgjsfgjf         |
----------------------------------

---------------------------------------
| PId |                email          |
|-----|-------------------------------|
|   4 |          sss@g.com            |
|   6 | 123@y.com                     |
|   7 | kkk@k.com                     |
|   9 | 454@h.com                     |
|   1 | sss@g.com                     |
|  22 | kkk@k.com                     |
|   1 | sss@g.com                     |
---------------------------------------

我想在两个表中显示匹配的id的uniid,我的查询是

select email,count(email) as EmailCount  , (STUFF((SELECT CAST(', ' + t1.uniid AS VARCHAR(MAX)) 
         FROM t1 
         join t2
         on t1.PId = t2.PId
         group by t1.uniid                                      
         FOR XML PATH ('')), 1, 2, '')) AS uni
from t1
inner join t2
on t1.PId = t2.PId
group by email

我的输出是

+------------------------------------------------------------------------------------------------------+
|       email          | EmailCount   |            uniid            |
--------------------------------------------------------------------------------------------------------
|    123@y.com   |  1        |           gfgjsfgjf , gsgjsfgjf , xxxxxggsgsg          |
--------------------------------------------------------------------------------------------------------
|kkk@k.com       |  1        |          gfgjsfgjf , gsgjsfgjf , xxxxxggsgsg          |
-------------------------------------------------------------------------------------------------------
|sss@g.com        |3         |            gfgjsfgjf , gsgjsfgjf , xxxxxggsgsg        |
+-----------------------------------------------------------------------------------------------------+

这里的列显示3,即使当计数为偶数时3列为单位。 如何才能显示匹配的pid的uniid。 我的sql小提琴是Sample DB

1 个答案:

答案 0 :(得分:2)

您可以先使用CTE进行连接,然后在主查询中使用相关子查询生成逗号分隔列表:

WITH cte AS
(
  SELECT email, uniid
  FROM #t1 t1
  JOIN #t2 t2
    ON t1.PId = t2.PId
)
SELECT DISTINCT email, 
     [EmailCount] = COUNT(*) OVER (PARTITION BY email),
     [skus]       = (STUFF((SELECT CAST(', ' + uniid AS VARCHAR(MAX)) 
                            FROM cte   c2  
                            WHERE c2.email = c1.email
                            FOR XML PATH ('')), 1, 2, ''))
FROM cte c1;

LiveDemo

输出:

╔═══════════╦════════════╦══════════════════════════════════════════╗
║   Email   ║ EmailCount ║                   Skus                   ║
╠═══════════╬════════════╬══════════════════════════════════════════╣
║ 123@y.com ║          1 ║ gsgjsfgjf                                ║
║ kkk@k.com ║          1 ║ gfgjsfgjf                                ║
║ sss@g.com ║          3 ║ xxxxxggsgsg , xxxxxggsgsg , xxxxxggsgsg  ║
╚═══════════╩════════════╩══════════════════════════════════════════╝