2016-11-14 4 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 

нет O Errors 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