2种方法实现了静态与动态的纵模表的转换的实例。
方法1:
select name
,sum(case subject when'数学' then source else 0 end ) as '数学'
,sum(case subject when'英语' then source else 0 end ) as '英语'
,sum(case subject when'语文' then source else 0 end ) as '语文'
from test
group by name
方法2:
declare @sql varchar(8000)
set @sql='select name,'
select @sql =@sql +'sum(case subject when '''+subject+''' then source else 0 end ) as '''+subject+''','
from (select distinct subject from test) as a
select @sql=left(@sql,len(@sql)-1)+' from test group by name'
exec(@sql)
go
PS:如果遇到日期汇总可用max()来解决如下:
declare @sql varchar(8000)
set @sql='select name,convert(varchar(10),date_1,120),'
select @sql =@sql +'max(case col_1 when '''+col_1+''' then date_1 else 0 end) as '''+col_1+''','
from (select distinct col_1 from Table_1) as a
select @sql=left(@sql,len(@sql)-1)+' from Table_1 group by name,convert(varchar(10),date_1,120) '
exec(@sql)