读书人

储存过程

发布时间: 2012-01-28 22:06:13 作者: rapoo

求一个储存过程
我有这样一个表:
A A 1
A B 2
A C 3
B A 4
B B 5
B C 6
C A 7
C B 8
C C 9


现在我要生成如下的一个临时表, 如何写SQL:

S\D A B C
A 1 2 3
B 4 5 6
C 7 8 9

[解决办法]
参考:
create table test (姓名 char(10),课程 char(10),成绩 int)
go
insert test values( '张三 ', '语文 ',80)
insert test values( '张三 ', '数学 ',86)
insert test values( '张三 ', '英语 ',75)
insert test values( '李四 ', '语文 ',78)
insert test values( '李四 ', '数学 ',85)
insert test values( '李四 ', '英语 ',78)
select * from test
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ',sum(case 课程 when ' ' '+课程+ ' ' ' then 成绩 end) [ '+课程+ '] '


from (select distinct 课程 from test) as a
select @sql = @sql+ ' from test group by 姓名 '
exec(@sql)

drop table test

--结果
/*
姓名 课程 成绩
张三 语文 80
张三 数学 86
张三 英语 75
李四 语文 78
李四 数学 85
李四 英语 78

姓名 数学 英语 语文
李四 85 78 78
张三 86 75 80
*/
[解决办法]

create table T([S\D] char(1), col2 char(1), col3 int)
insert T select 'A ', 'A ', 1
union all select 'A ', 'B ', 2
union all select 'A ', 'C ', 3
union all select 'B ', 'A ', 4
union all select 'B ', 'B ', 5
union all select 'B ', 'C ', 6
union all select 'C ', 'A ', 7
union all select 'C ', 'B ', 8
union all select 'C ', 'C ', 9

declare @sql varchar(8000)
set @sql= 'select [S\D], '
select @sql=@sql+quotename(col2)+ '=max(case when col2= '+quotename(col2, ' ' ' ')+ ' then col3 end), '
from T
group by col2

select @sql=left(@sql, len(@sql)-1), @sql=@sql+ ' from T group by [S\D] '
exec(@sql)

--result
S\D A B C
---- ----------- ----------- -----------
A 1 2 3
B 4 5 6
C 7 8 9

读书人网 >SQL Server

热点推荐