2016-06-24 3 views
0

도대체 이것이 작동하지 않는 이유 ??? 내가 여기에서 찾은 모든 것을 따라 오는 것 같다. '# TempTable.clientId'열은 집계 함수 또는 GROUP BY 절에 포함되어 있지 않기 때문에 선택 목록에서 유효하지 않습니다.STUFF 사용시 문제

그룹에 tt.clientId를 추가하면 항목을 처리하지 않고 모두 한 줄로 결합하므로 별도의 행으로 나타납니다. 오타 나 뭔가를 만들었나요? WHERE tt.clientId = c.ID

그렇지 않으면, 어떻게 SQL Server가 알고 않는 각 역에 사용 된 ClientID :

SELECT tt.Station, STUFF((SELECT ', ' + c.client_code 
    FROM client c 
    WHERE tt.clientId = c.ID 
    FOR XML PATH('')),1,1,'') [Values]    
FROM #TempTable tt 
GROUP BY tt.Station 

답변

1

SELECT ... FOR XML PATHGROUP BY 열 [tt.station]의 함수 여야합니다. 거기에 몇 가지 대안이 여기에 있습니다, 그러나 여기에서 고려해야 할 몇 가지 것들 그

SELECT tt.Station, STUFF((SELECT ', ' + c.client_code 
    FROM client c 
    JOIN #TempTable tt2 
     ON tt2.clientId = c.ID 
     AND tt2.Station = tt.Station 
    FOR XML PATH('')),1,1,'') [Values]    
FROM 
GROUP BY tt.Station 
+0

어, 그건 나를 미치게 만들었습니다. 이제는 더 의미가 있습니다, 감사합니다! – Relevant

1

당신은 당신이 여기에 하위 쿼리 상관 관계를 사용하고 있기 때문에 GROUP BY에 tt.ClientId를 추가해야?

ClientId별로 그룹화하지 않으려면 tt.Station에서 상호 연관시켜야합니다.

1

같은 뭔가 :

  1. 당신이 당신의 가장 왼쪽에있는 항목이 원하는 것을 결정은 -이 경우, 그것을 station 인 것으로 보입니다. 그런 경우에 접근하는 한 가지 방법은 먼저 별개의 스테이션 세트를 얻는 것입니다. 그룹 별 또는 고유 한 그룹을 사용하여 수행 할 수 있습니다.
  2. 목록을 생성하려는 항목의 레벨을 결정하십시오.이 경우에는 client_code입니다. 따라서, 당신은 그 수준에 있기 위해 내부 선택을하고 싶습니다. 이를 수행하는 한 가지 방법은 xml을 사용하기 전에 클라이언트 코드의 고유 한 집합을 해결하는 것입니다.

한 가지 비판 - 간단한 데이터 세트를 제공하는 것이 좋습니다. 훨씬 쉽고 빠르게 답변을 제공합니다.

여기에도 대안이 있지만 여기에는 가능한 해결책이 있습니다.

테스트 데이터

select top (100) 
    client_id = abs(checksum(newid())) % 100, 
    client_code = char(abs(checksum(newid())) % 10 + 65) 
into #client 
from sys.all_columns a 
cross join sys.all_columns b; 

select top (100) 
    station = abs(checksum(newid())) % 10, 
    client_id = abs(checksum(newid())) % 50 -- just a subset 
into #temp 
from sys.all_columns a 
cross join sys.all_columns b; 

쿼리

select station, client_codes = stuff((
    select ', ' + cc.client_code 
    from (
     select distinct c.client_code -- distinct client codes 
     from #temp t 
     join #client c 
      on t.client_id = c.client_id 
     where t.station = s.station) cc 
    order by client_code 
    for xml path('')), 1, 2, '') 
from (
    select distinct station 
    from #temp) s; -- distinct stations 

결과

station  client_codes 
----------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
0   B, C, D, E, G, J 
1   A, B, D, G, H, J 
2   A, C, E, F, G, H, J 
3   B, C, H, J 
4   A, B, C, D, F, H, J 
5   H, J 
6   D, E, F, G, I 
7   A, C, D, F, G, H, J 
8   A, E, G 
9   C, E, F, G, I 

희망이 도움이됩니다.