方法1
select name,
sum(case when course='物理' then score else 0 end) as 物理,
sum(case when course='英语' then score else 0 end) as 英语
from T1
方法2
动态SQL命令的执行效率往往不高,因为动态拼接的原因,导致数据库(查询优化器)可能无法对这样的命令进行优化。此外,这样的SQL命令还受限于字符串的长度(需要事先确定其长度限制),而动态SQL命令的长度往往是根据实际表的内容而改变,因此这类动态SQL命令无法保证100%正常运行。
alter PROCEDURE P1
AS
BEGIN
–申明一个字符串用于动态拼接
declare @sql varchar(8000) =null
–拼接SQL语句
set @sql = ‘select name as “姓名”’
–动态地获得材料名,为每个材料构建一个列
select @sql = @sql + ‘,SUM(case course when ‘’’+temp.Item+‘’’ then score else 0 end) as [‘+temp.Item+’–]’
from (select distinct course as Item from T1) as temp
–最终拼上数据源和分组依据
select @sql = @sql + ’ from T1 group by name’
–执行SQL语句
print(@sql)
exec(@sql)
END
GO
方法3
select * from T1
PIVOT(sum(score)FOR course in(物理,英语)) tt
UNPIVOT 列变行
select , --非透视列
[unpivot_column], --透视列
[value_column],
from table_name
unpivot ( [value_column] for [unpivot_column] in ( <column_list> ) )
as --别名
–[value_column] 确定一个列名称来代表不转换的列的数据。
–[unpivot_column] 转换列的名称
–<column_list>: 被转换的列的列名称。
select u.name, u.subject, u.score
from stu_score
unpivot
(
score
for subject in (Math, Chinese)
) u;