读书人

行列有关问题

发布时间: 2012-02-01 16:58:19 作者: rapoo

行列问题
年份 A B C D
2004 100 1 2 3
2004 150 4 5 6
2004 200 7 8 9
2005 100 1 2 3
2005 150 4 5 6
2005 200 7 8 9
2006 100 1 2 3
2006 150 4 5 6
2006 200 7 8 9
变成
年份 类别 100 150 200 ...
2004 B 1 4 7
2004 C 2 5 8
2004 D 3 6 9
2005 B 1 4 7
2005 C 2 5 8
2005 D 3 6 9
2006 B 1 4 7
2006 C 2 5 8
2006 D 3 6 9 如何实现?




[解决办法]
create table t([year] int,A int,B int,C int,D int)
insert into t select 2004,100,1,2,3
insert into t select 2004,150,4,5,6
insert into t select 2004,200,7,8,9
insert into t select 2005,100,1,2,3
insert into t select 2005,150,4,5,6
insert into t select 2005,200,7,8,9
insert into t select 2006,100,1,2,3
insert into t select 2006,150,4,5,6
insert into t select 2006,200,7,8,9
go

declare @sql varchar(8000)
select @sql= ' '

select @sql=@sql+ ',[ '+rtrim(A)+ ']=max(case A when '+rtrim(A)+ ' then v end) '
from t group by A order by A

set @sql= 'select [year],[type] '+@sql
+ ' from (select [year],A, ' 'B ' ' as [type], B as v from t '
+ ' union all '
+ ' select [year],A, ' 'C ' ' as [type], C as v from t '
+ ' union all '
+ ' select [year],A, ' 'D ' ' as [type], D as v from t) a '
+ ' group by [year],[type] '
+ ' order by [type],[year] '

exec(@sql)
go

/*
year type 100 150 200
----------- ---- ----------- ----------- -----------
2004 B 1 4 7
2005 B 1 4 7
2006 B 1 4 7
2004 C 2 5 8
2005 C 2 5 8
2006 C 2 5 8
2004 D 3 6 9


2005 D 3 6 9
2006 D 3 6 9
*/


drop table t
go

读书人网 >SQL Server

热点推荐