34,837
社区成员




create table tb(name varchar(10),score int)
insert into tb values('wang' , 95)
insert into tb values('zhang', 95)
insert into tb values('li' , 80)
insert into tb values('huang', 74)
go
--静态SQL,指同一个分数最多有2(N)个。
select score ,
max(case px when 1 then name else '' end) 'name1',
max(case px when 2 then name else '' end) 'name2'
from
(
select px = (select count(1) from tb where score = t.score and name < t.name) + 1 , * from tb t
) m
group by score
order by score
/*
score name1 name2
----------- ---------- ----------
74 huang
80 li
95 wang zhang
(3 行受影响)
*/
--静态SQL,指同一个分数不知道有多少个,以最多的一个为准。
declare @sql varchar(8000)
set @sql = 'select score'
select @sql = @sql + ' , max(case px when ''' + cast(px as varchar) + ''' then name else '' '' end) [name' + cast(px as varchar) + ']'
from (select distinct px from (select px = (select count(1) from tb where score = t.score and name < t.name) + 1 , * from tb t) m) as a
set @sql = @sql + ' from (select px = (select count(1) from tb where score = t.score and name < t.name) + 1 , * from tb t) m group by score order by score'
exec(@sql)
/*
score name1 name2
----------- ---------- ----------
74 huang
80 li
95 wang zhang
(3 行受影响)
*/
drop table tb
create table tb(name varchar(10),score int)
insert into tb values('wang' , 95)
insert into tb values('zhang', 95)
insert into tb values('li' , 80)
insert into tb values('huang', 74)
go
select score ,
max(case px when 1 then name else '' end) 'name1',
max(case px when 2 then name else '' end) 'name2'
from
(
select px = (select count(1) from tb where score = t.score and name < t.name) + 1 , * from tb t
) m
group by score
order by score
drop table tb
/*
score name1 name2
----------- ---------- ----------
74 huang
80 li
95 wang zhang
(3 行受影响)
*/
create table tb(name varchar(10),score int)
insert into tb values('wang' , 95)
insert into tb values('zhang', 95)
insert into tb values('li' , 80)
insert into tb values('huang', 74)
go
--动态SQL,同一个分数score不知道有多少个,以最多的px一个为准。
declare @sql varchar(8000)
set @sql = 'select score'
select @sql = @sql + ' , max(case px when ''' + cast(px as varchar) + ''' then name else '' '' end) [name' + cast(px as varchar) + ']'
from (select distinct px from (select px = (select count(1) from tb where score = t.score and name < t.name) + 1 , * from tb t) m) as a
set @sql = @sql + ' from (select px = (select count(1) from tb where score = t.score and name < t.name) + 1 , * from tb t) m group by score order by score'
exec(@sql)
/*
score name1 name2
----------- ---------- ----------
74 huang
80 li
95 wang zhang