2016-11-14 8 views
1

첫 번째 포스터이므로 필요한 모든 것을 자세히 설명하지 않은 경우 사과드립니다! 비슷한 질문은 찾았지만 찾을 수는 없었습니다.SQL STUFF 및 CASE 표현식 및 조인 된 테이블

나는 같은 차량에 앉아 됨으로써 다른 클라이언트에 연결되어 클라이언트를 표시하는 쿼리 작성 요청을받은

-

간단히 말해
Ref Ref2 
1  2 
1  3 
1  4 
2  1 
2  3 
2  4 

, 클라이언트 1,2,3,4 모두에를 같은 차량과 그래서 그들을 함께 연결하는 테이블에 행이 있습니다.

내 쿼리의 나머지 부분과 동일한 행에있는 보고서에 링크 된 파일의 세부 정보를 추가해야하는 과제가 있습니다. 나는 여기에 또 다른 질문에서 발견 된 물건 기능을 사용하여 이것을 수행했습니다 :

select distinct r.ref 
, stuff(
(select ','+r2.ref2 as [text()] 
from related r 
where r2.ref = r.ref 
for xml path ('') 
),1,1,' ') as [linked] 
from related r2 

행 1 : 2,3,4에 표시되며 정상적으로 작동합니다.

내가해야 할 일은 위와 같은 이론을 사용하여 차량 내에서의 클라이언트의 위치를 ​​상세히 설명하는 것과 같습니다. 여기

Ref |Linked | Driver/Passenger 
1 | 2,3,4 | D,P,P,P 

내가 CASE 식을 사용하여 적응으로 쿼리입니다 - 내 조인이 문제 중 하나라고 생각하고, 다른 곳 포함하는 시도했지만 아무 소용이 :

select distinct r.ref 
, stuff(
(select ','+CASE WHEN s.status = 'DRV' THEN 'D' WHEN 
s.status = 'PASVEC' THEN 'P' WHEN s.status = 'OWNND' THEN 'P' ELSE '' END [text()] 
from status s 
where s.ref = r.ref2 -- Looking at the ref of the linked case 
for xml path ('')),1,1,' ') as [D/P] 
from related r 

편집 :

내가 얻고 출력은 관련된 모든 경우의 목록

Ref | D/P 
1 | D 
2 | P 
3 | P 
4 | P 

오류 오 익스플로러되지 않습니다 utput.

또한 from 문에서 내부 조인을 시도했습니다.

미리 도움 주셔서 감사합니다.

+0

한 가지. FROM Satus S INNER JOIN <기타 테이블 이름> R ON s.ref = r.ref2. 쿼리를 통해 오류가 발생합니까? 출력 샘플을 게시 할 수 있습니까? –

+0

원하는 방식으로 반환되지 않는 것이 있습니다. 그러나 문제는 무엇인지 알려주지 않습니다. 여기서 시작하는 것이 좋습니다. http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

+0

사과 - 세부 정보 출력으로 업데이트되었습니다! – Laing111

답변

1

사람의 Main/Linked 상태에 대한 다른 표현을 원한다면 약간 다른 FOR XML을 가질 수 있습니까?

declare @t table(r int, r2 int, PDstatus nvarchar(50)); 
insert into @t values 
(1,2,'DRV') 
,(1,3,'PASVEC') 
,(1,4,'DRV') 
,(2,1,'DRV') 
,(2,3,'OWNND'); 

select d.r 
     ,stuff((select ', ' + cast(p.r2 as nvarchar(10)) 
       from @t p 
       where d.r = p.r 
       for xml path('') 
       ) 
      ,1,2,'' 
      ) as Linked 

     -- This assumes the Main record is always the driver? 
     ,'D' + (select case p.PDstatus when 'DRV' then ', D' 
             when 'OWNND' then ', P' 
             when 'PASVEC' then ', P' 
         else ', X' 
         end 
       from @t p 
       where d.r = p.r 
       for xml path('') 
       ) as DP 
from @t d; 

출력 : 적절한는 성명에서에 참여하고있는 데 도움이 될 수 있습니다

r |Linked |DP 
1 |2, 3, 4 |D, D, P, D 
1 |2, 3, 4 |D, D, P, D 
1 |2, 3, 4 |D, D, P, D 
2 |1, 3 |D, D, P 
2 |1, 3 |D, D, P