34,594
社区成员
发帖
与我相关
我的任务
分享
if object_id('tb') is not null drop table tb
create table tb (id int,name varchar(50),q varchar(50))
insert into tb
select 1,'a','aa11' union all
select 1,'a','aa22' union all
select 2,'b','bb11' union all
select 2,'b','bb22' union all
select 2,'b','bb33' union all
select 3,'c','cc11'
想要结果
id name q1 q2 q3 ...
1 a aa11 aa22
2 b bb11 bb22 bb33
3 c cc11
...
select
id,
name,
max(case when q like '%11' then q else '' end) as [q1],
max(case when q like '%22' then q else '' end) as [q2],
max(case when q like '%33' then q else '' end) as [q3]
from tb
group by id,name
/**
id name q1 q2 q3
----------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------------------------------
1 a aa11 aa22
2 b bb11 bb22 bb33
3 c cc11
(所影响的行数为 3 行)
**/
--sql 2005
create table tb (id int,name varchar(50),q varchar(50))
insert into tb
select 1,'a','aa11' union all
select 1,'a','aa22' union all
select 2,'b','bb11' union all
select 2,'b','bb22' union all
select 2,'b','bb33' union all
select 3,'c','cc11'
go
declare @sql varchar(8000)
set @sql = 'select id , name '
select @sql = @sql + ' , max(case px when ''' + cast(px as varchar) + ''' then q else '''' end) [q' + cast(px as varchar) + ']'
from (select distinct px from (select * , px = row_number() over(partition by id , name order by q)from tb t ) m) as a
set @sql = @sql + ' from (select * , px = row_number() over(partition by id , name order by q)from tb t ) m group by id , name'
exec(@sql)
drop table tb
/*
id name q1 q2 q3
----------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------------------------------
1 a aa11 aa22
2 b bb11 bb22 bb33
3 c cc11
(3 行受影响)
*/
--上面漏了个name
--sql 2000
create table tb (id int,name varchar(50),q varchar(50))
insert into tb
select 1,'a','aa11' union all
select 1,'a','aa22' union all
select 2,'b','bb11' union all
select 2,'b','bb22' union all
select 2,'b','bb33' union all
select 3,'c','cc11'
go
declare @sql varchar(8000)
set @sql = 'select id , name '
select @sql = @sql + ' , max(case px when ''' + cast(px as varchar) + ''' then q else '''' end) [q' + cast(px as varchar) + ']'
from (select distinct px from (select * , px = (select count(1) from tb where id = t.id and name = t.name and q < t.q) + 1 from tb t ) m) as a
set @sql = @sql + ' from (select * , px = (select count(1) from tb where id = t.id and name = t.name and q < t.q) + 1 from tb t) m group by id , name'
exec(@sql)
drop table tb
/*
id name q1 q2 q3
----------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------------------------------
1 a aa11 aa22
2 b bb11 bb22 bb33
3 c cc11
*/
--sql 2000
create table tb (id int,name varchar(50),q varchar(50))
insert into tb
select 1,'a','aa11' union all
select 1,'a','aa22' union all
select 2,'b','bb11' union all
select 2,'b','bb22' union all
select 2,'b','bb33' union all
select 3,'c','cc11'
go
declare @sql varchar(8000)
set @sql = 'select id '
select @sql = @sql + ' , max(case px when ''' + cast(px as varchar) + ''' then q else '''' end) [q' + cast(px as varchar) + ']'
from (select distinct px from (select * , px = (select count(1) from tb where id = t.id and name = t.name and q < t.q) + 1 from tb t ) m) as a
set @sql = @sql + ' from (select * , px = (select count(1) from tb where id = t.id and name = t.name and q < t.q) + 1 from tb t) m group by id'
exec(@sql)
drop table tb
/*
id q1 q2 q3
----------- -------------------------------------------------- -------------------------------------------------- --------------------------------------------------
1 aa11 aa22
2 bb11 bb22 bb33
3 cc11
*/