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