2016-11-08 60 views
1
id | systemName | Systemid  
------------------------------- 
    100 | A100 |  1 
    100 | B100 |  2 
    100 | C100 |  3 
    100 | D100 |  4 
    200 | A100 |  1 
    200 | B200 |  2 

實現以下結果的最佳方法是什麼?柱系統的名稱應該用逗號分隔值計算系統SQL組通過並交叉應用

id  Systemidcount SystemName 
--------------------------------------------- 
100 | 4 |   A100,B100,C100,D100 
200 | 2 |   A100,B200 

的我不能夠正確地格式化,出於某種原因,道歉

+0

必須是一個逗號分隔值? – McNets

+0

如果不是分隔名稱的標識符,謝謝您的關注。 – lms

回答

1

您可能會注意到子查詢別名A.這是爲了防止在CROSS APPLY中的多餘呼叫

Declare @YourTable table (id int,systemname varchar(25),systemid int) 
Insert Into @YourTable values 
(100,'A100',1), 
(100,'B100',2), 
(100,'C100',3), 
(100,'D100',4), 
(200,'A100',1), 
(200,'B200',2) 

Select A.* 
     ,SystemName = B.Value 
From (Select ID,Systemidcount = count(*) From @YourTable Group By ID) A 
Cross Apply (
       Select Value=Stuff((Select Distinct ',' + systemname 
         From @YourTable 
         Where ID=A.ID 
         For XML Path ('')),1,1,'') 

      ) B 
Order By ID 

返回

ID Systemidcount SystemName 
100 4    A100,B100,C100,D100 
200 2    A100,B200 
0

這是字符串聚集:

select id, count(*) as systemidcount, 
     stuff(v.systemnames, 1, 1, '') as systemnames 
from t cross apply 
    (select ',' + systemName 
     from t t2 
     where t2.id = t.id 
     for xml path ('') 
    ) v(systemnames); 
0
SELECTid,COUNT(Systemid) as SystemidCount, 
SystemName=Stuff((SELECT ',' + SystemName FROM t t1 WHERE t1.id=t.id 
FOR XML PATH ('')) 
      , 1, 1, '') 
FROM t 
GROUP BY id