我有这样一个表:
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
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
*/
go
insert test values('A','A',1)
insert test values('A','B',2)
insert test values('A','C',3)
insert test values('B','A',4)
insert test values('B','B',5)
insert test values('B','C',6)
insert test values('C','A',7)
insert test values('C','B',8)
insert test values('C','C',9)
select * from test
declare @sql varchar(8000)
set @sql = 'select C1 AS [S\D]'
select @sql = @sql + ',sum(case C2 when '''+C2+''' then C3 end) ['+C2+']'
from (select distinct C2 from test) as a
select @sql = @sql+' from test group by C1'
exec(@sql)drop table test--结果
/*
C1 C2 C3
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 9S、D A B C
A 1 2 3
B 4 5 6
C 7 8 9
*/
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', 9declare @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 col2select @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
create table test (C1 char(10),C2 char(10),C3 int)
go
insert test values('A','A',1)
insert test values('A','B',2)
insert test values('A','C',3)
insert test values('B','A',4)
insert test values('B','B',5)
insert test values('B','C',6)
insert test values('C','A',7)
insert test values('C','B',8)
insert test values('C','C',9)
gocreate proc row_col_change
@tbname varchar(20),
@colname varchar(20)
as
declare @sql varchar(8000)
set @sql = 'select '+@colname+' AS [S\D]'
select @sql = @sql + ',sum(case C2 when '''+C2+''' then C3 end) ['+C2+']'
from (select distinct C2 from test) as a
select @sql = @sql+' from '+@tbname+' group by '+@colname
exec(@sql)
goexec row_col_change 'test','C1'drop table test
drop proc row_col_change--结果
/*
S\D A B C
A 1 2 3
B 4 5 6
C 7 8 9
*/
我的表中不一定只有ABC三个,可能有N个,如果有N个的话,就会有N*N行,如N=4则:A A 1
A B 2
A C 3
A d 3
B A 4
B B 5
B C 6
B D 6
C A 7
C B 8
C C 9
C D 10
D A 11
D B 12
D C 13
D D 14