sql纵表横表转换疑惑
假设有张学生成绩表(tb)如下:
Name Subject Result
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
*/
-------------------------------------
/*
想变成
姓名 语文 数学 物理
---------- ----------- ----------- -----------
李四 74 84 94
张三 74 83 93
*/
我想用动态的去转换,代码如下:
declare @sql varchar(8000)
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'from (select distinct Subject from tb) as a
set @sql = @sql + ' from tb group by name'
exec(@sql)
上面代码执行结果是正确的,问题是我不明白红色标注中那个3个单引号的Subject与后面的Subject如何关联的?调试后我看到有subject=‘**'之类的,但是我没有看到语句有等号哟?可能是动态语法问题,求解释
------解决方案--------------------
max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
举个例子
max(case Subject when '语文' then Result else 0 end) [语文]
-->即当Subject='语文'时,取对应的Result,否则取0,相当于
max(case when Subject='语文' then Result else 0 end) [语文]