22,295
社区成员
发帖
与我相关
我的任务
分享create table tb(id varchar(10),px int,val int)
insert into tb values('a' , 1 , 2)
insert into tb values('a' , 2 , 3)
insert into tb values('a' , 3 , 3)
insert into tb values('b' , 1 , 2)
insert into tb values('b' , 2 , 4)
insert into tb values('b' , 5 , 5)
go
-- 如果你每个ID最多三个值。用静态SQL。
select id,
max(case px1 when 1 then val else 0 end) val1,
max(case px1 when 2 then val else 0 end) val2,
max(case px1 when 3 then val else 0 end) val3
from
(
select * , px1 = (select count(1) from tb where id = t.id and px < t.px) + 1 from tb t
) m
group by id
/*
id val1 val2 val3
---------- ----------- ----------- -----------
a 2 3 3
b 2 4 5
(所影响的行数为 2 行)
*/
-- 如果你每个ID值的个数不确定。用动态SQL。
declare @sql varchar(8000)
set @sql = 'select id '
select @sql = @sql + ' , max(case px1 when ''' + cast(px1 as varchar) + ''' then val else 0 end) [val' + cast(px1 as varchar) + ']'
from (select distinct px1 from (select * , px1 = (select count(1) from tb where id = t.id and px < t.px) + 1 from tb t)m) as a
set @sql = @sql + ' from (select * , px1 = (select count(1) from tb where id = t.id and px < t.px) + 1 from tb t) m group by id'
exec(@sql)
/*
id val1 val2 val3
---------- ----------- ----------- -----------
a 2 3 3
b 2 4 5
*/
drop table tb