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

Каков наилучший способ достичь результата? Имя системы Колонка должна иметь значения, разделенные запятыми подсчитанных системSQL group by and cross apply

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

Я не могу отформатировать его правильно по какой-то причине, извинения

+0

должны быть разделенные запятыми? – McNets

+0

если не идентификатор для разделения имен друг от друга, спасибо за это. – lms

ответ

1

Вы можете заметить подзапрос alias 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