2016-11-08 19 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