日期:2014-05-17  浏览次数:20633 次

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) [语文]