Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server łączy wiele wierszy w jeden

Myślę, że kluczem do tego jest zrozumienie, w które bloki wpadają 188,198 i 88. W poniższym cte pracuję na podstawie tego, że 88 zawsze kończy blok i przypisuję wiersz z 88 do wszystkich wierszy mniejszych od niego - umożliwiając w ten sposób grupowanie według.

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

Wynik

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak serwer sql sortuje twoje dane?

  2. SQL Grant wykonuje się na wielu obiektach

  3. Zwracanie nazwy miesiąca w zapytaniu SQL Server

  4. Krąg serwera SQL

  5. Najszybszy sposób na wielokrotne uruchamianie tego samego zapytania w SQL Server