日期:2014-05-19  浏览次数:20523 次

一个显示格式转换的题目请教各位高手!
有这么一个表
id         val
a           40
a           50
a           60
b           45
b           55
b           65
将其转换为下面格式
id         val1           val2         val3
a           40                 50             60
b           45                 55             65

请问应该怎么做?谢谢!

------解决方案--------------------
--如果每個ID只有三個,且ID相同的時候,val不會相同的話
Create Table TEST
(id Varchar(10),
val Int)
Insert TEST Select 'a ', 40
Union All Select 'a ', 50
Union All Select 'a ', 60
Union All Select 'b ', 45
Union All Select 'b ', 55
Union All Select 'b ', 65
GO
Select
id,
SUM(Case CountID When 1 Then val Else 0 End) As val1,
SUM(Case CountID When 2 Then val Else 0 End) As val2,
SUM(Case CountID When 3 Then val Else 0 End) As val3
From
(Select CountID = (Select Count(*) From TEST Where id = A.id And val <= A.val), * From TEST A) B
Group By
id
GO
Drop Table TEST
--Result
/*
id val1 val2 val3
a 40 50 60
b 45 55 65
*/
------解决方案--------------------
create table #tab1 (id int,val int)
inset into #tab1 values(a,40)
inset into #tab1 values(a,50)
inset into #tab1 values(a,60)
inset into #tab1 values(b,45)
inset into #tab1 values(b,55)
inset into #tab1 values(b,65)
go
inset into #tab2 select a as id, 40 as val1,50 as val2,60 as val3
union all
select b as id,45 as val1,55 as val2,65 as val3

select * from #tab2

drop table #tab1
drop table #tab2
------解决方案--------------------
if object_id( 'pubs..tb ') is not null
drop table tb
go

create table tb(id varchar(10),val int)
insert into tb(id,val) values( 'a ', 40)
insert into tb(id,val) values( 'a ', 50)
insert into tb(id,val) values( 'a ', 60)
insert into tb(id,val) values( 'b ', 45)
insert into tb(id,val) values( 'b ', 55)
insert into tb(id,val) values( 'b ', 65)
go

declare @sql varchar(8000)
set @sql = 'select id '
select @sql = @sql + ' , max(case px when ' ' ' + cast(px as varchar) + ' ' ' then val else 0 end) [ ' + 'val ' + cast(px as varchar) + '] '
from (select distinct px from (select px=(select count(1) from tb where id=a.id and val <a.val)+1 , * from tb a) t) as a
set @sql = @sql + ' from (select px=(select count(1) from tb where id=a.id and val <a.val)+1 , * from tb a) t group by id '
exec(@sql)

drop table tb

/*
id val1 val2 val3
---------- ----------- ----------- -----------
a 40 50 60
b 45 55 65
*/