普通行列轉換
假設有張學生成績表(t)如下
Name Subject Result
張三 語文 73
張三 數學 83
張三 物理 93
李四 語文 74
李四 數學 84
李四 物理 94
想變成
姓名 語文 數學 物理
張三 73 83 93
李四 74 84 94
create table #t
(
Name varchar(10) ,
Subject varchar(10) ,
Result int
)
insert into #t(Name , Subject , Result) values('張三','語文','73')
insert into #t(Name , Subject , Result) values('張三','數學','83')
insert into #t(Name , Subject , Result) values('張三','物理','93')
insert into #t(Name , Subject , Result) values('李四','語文','74')
insert into #t(Name , Subject , Result) values('李四','數學','83')
insert into #t(Name , Subject , Result) values('李四','物理','93')
declare @sql varchar(8000)
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , sum(case Subject when ''' + Subject + ''' then Result end) [' + Subject + ']'
from (select distinct Subject from #t) as a
set @sql = @sql + ' from #t group by name'
exec(@sql)
drop table #t
--結果
姓名 數學 物理 語文
---------- ----------- ----------- -----------
李四 83 93 74
張三 83 93 73
例2:
/*行列轉換*/
declare @sql varchar(8000)
set @sql = 'select Hg01,Hg03'
select @sql = @sql + ' , sum(case Hg02 when ''' + Hg02 + ''' then Hg04 end) [' + Hg02 + ']'
from (select distinct Hg02 from khm07) as a
set @sql = @sql + ' from khm07 group by Hg01,Hg03 order by Hg01,Hg03'
exec(@sql)
print @sql
--select Hg01,Hg03,Hg02,Hg04 from khm07 where Hg01='A' and Hg03='acdc'