2016-08-23 3 views
-1

Я хочу несколько строк, которые будут объединены в один рядSQL Server объединить несколько строк в одну

image

клиент с Inv_ID = 188, 198 и 82 должны быть объединены в одну строку

Результат должен иметь два ряда ..

ClientID | Input(188) | Input(198 | Input(82)    |Date(188)   |Date (198) 
-------------------------------------------------------------------- 
133  | Yes  | yes  | Referred to comm Pres | 2016-08-16 01:00 | 2016-8-01 
133  | yes  | yes  | Referred to comm Pres | 2016-08-17 00:00 | 2016-08-17 

Может ли кто-нибудь мне помочь?

спасибо.

+0

Какие части этих строк вы хотите показать? Например. какое значение 'M_ID', какое значение' Input' ?? –

+0

Я хочу, чтобы результат был следующим ClientID | Вход (188) | Ввод (198 | Вход (82) | Дата (188) | Дата (198) 133 | Да | да | Разрешено к комм Преж | 2016-08-16 01: 00 | 2016-8-01: 133 | yes | yes | Refer to comm Pres | 2016-08-17 00:00 | 2016-08-17 –

+0

Я показал результат, который я ожидал от описания –

ответ

0

Я думаю, что ключом к этому является понимание того, что блокирует 188,198 и 88 лет. В приведенном ниже цикле я работаю на том основании, что 88 всегда завершает блок, и я назначаю rowid из 88 ко всем строкам меньше, чем это, что позволяет группе.

declare @t table(client_id int, m_id int,chid int,inv_id int,input varchar(20),dt datetime,rowid int) 
insert into @t values 
(133,928,9581,188,'yes_b1','2016-08-16 01:00:00:000',1), 
(133,929,9581,198,'yes_b1','2016-08-16 01:10:00:000',2), 
(133,930,9581,82,'referred_b1','2016-08-16 01:30:00:000',3), 
(133,935,9584,188,'yes_b2','2016-08-16 01:00:00:000',5), 
(133,936,9584,198,'yes_b2','2016-08-16 01:00:00:000',6), 
(133,937,9584,82,'referred_b2','2016-08-16 01:00:00:000',7) 

;with cte as 
(
select s.*, 
     lag(s.hi,1,0) over (order by s.inv_id) as lo 
from 
(
select inv_id,rowid as hi 
from @t 
where inv_id = 82 
)s 
) 
select t.client_id, 
     max(case when t.inv_id = 188 then input end) 'input(188)', 
     max(case when t.inv_id = 198 then input end) 'input(198)', 
     max(case when t.inv_id = 82 then input end) 'input(82)', 
     max(case when t.inv_id = 188 then dt end) 'date(188)', 
     max(case when t.inv_id = 198 then dt end) 'date(198)', 
     max(case when t.inv_id = 82 then dt end) 'date(82)' 
from @t t 
join cte on rowid <= cte.hi and rowid > cte.lo 
group by client_id,cte.hi 

Результат

client_id input(188)   input(198)   input(82)   date(188)    date(198)    date(82) 
----------- -------------------- -------------------- -------------------- ----------------------- ----------------------- ----------------------- 
     133 yes_b1    yes_b1    referred_b1   2016-08-16 01:00:00.000 2016-08-16 01:10:00.000 2016-08-16 01:30:00.000 
     133 yes_b2    yes_b2    referred_b2   2016-08-16 01:00:00.000 2016-08-16 01:00:00.000 2016-08-16 01:00:00.000 
+0

Большое спасибо P.Salmon –

Смежные вопросы