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

重金求子 查询 ,, ############# 100% 结贴

 declare @sql nvarchar(1000)
 select @sql=isnull(@sql+',','')+'max(case when course='''+course+''' then grade else 0 end) as '+course+''
 from (select distinct course from #aa) a
print @sql

--------------------
  max(case when course='数学' then grade else 0 end) as 数学,max(case when course='英语' then grade else 0 end) as 英语,max(case when course='语文' then grade else 0 end) as 语文


上面是行转列一个查询语句。。但是不明白的是为什么@sql输入的是这个,
 t @sql=isnull(@sql+',','') 这算是循环吗? 查询语句是怎么查询的,?或者说是怎么样的一种运行机制?

------解决方案--------------------
这是一种比较特别的写法,sql server特有的写法把

就是当你的select子句中有一个变量,并且是这种格式:

select @t = @t + xxx
from tb

那么就像是一个循环一下,会不断把xxx加到@t变量中
------解决方案--------------------
这个是一种挺有用的技巧把。

特别是用于拼接动态语句时,就如你上面的语句一样
------解决方案--------------------
isnull(@sql+',','') 
2个作用: 
1.首次执行时,自动赋值''给@sql.
2.行与行之间,用逗号连接在一起.
------解决方案--------------------
找到所有的科目,把Case When 字符串合并到一起
------解决方案--------------------
不算循环,只是把某列一直累加上去