日期:2014-05-18  浏览次数:20642 次

求sql 原理
Name Subject Result
张三 语文 80
张三 数学 90
张三 物理 85
李四 语文 85
李四 数学 92
李四 物理 82


实现结果
姓名 语文 数学 物理  
张三 80 90 85
李四 85 92 82

第一种
declare @sql varchar(8000)
select @sql = 'select Name, max(case Subject when ''' + Subject+ ''' then Result else 0 end) [' + Subject+ ']'
from (select distinct Subject from cj) as a
set @sql = @sql + ' from cj group by Name'
print @sql

第二种
declare @sql1 varchar(8000)
set @sql1 = 'select Name'
select @sql1 = @sql1+', max(case Subject when ''' + Subject+ ''' then Result else 0 end) [' + Subject+ ']'
from (select distinct Subject from cj) as a
set @sql1 = @sql1 + ' from cj group by Name'
print @sql1

为什么第二种方法可以 第一种不可以 能讲下原理吗 我不太清楚 希望越细越好 谢谢!!!

------解决方案--------------------
SQL code
declare @sql varchar(8000)
set @sql=''--赋值,否则为null
select @sql = 'select Name, max(case Subject when ''' + Subject+ ''' then Result else 0 end) [' + Subject+ ']'
from (select distinct Subject from cj) as a
set @sql = @sql + ' from cj group by Name'
print @sql

------解决方案--------------------
第一种@sql 没有初始值,null 加任何值还是null
------解决方案--------------------

SQL code

把你的打印出来就是如下。

select Name, max(case Subject when '语文' then Result else 0 end) [语文] from cj group by Name


select Name, max(case Subject when '数学' then Result else 0 end) [数学],
max(case Subject when '物理' then Result else 0 end) [物理],
max(case Subject when '语文' then Result else 0 end) [语文] from tb group by Name

 就是想问这两列的区别,。  你是想把列中的值 '数学' '物理' '语文' 的都单独作为一个列  当然要
三个列了、

------解决方案--------------------
把初始化下就行