首页 新闻 会员 周边 捐助

sql 动态拼接的一个问题,大侠帮忙看下 谢谢!

0
[待解决问题]

在博客园看了下别人写的文章 遇到了一个问题,不理解如:

这个是写死的sql(when语文,数学,物理

select 姓名,
 max(case 课程 when'语文'then 分数 else 0 end)语文,
 max(case 课程 when '数学' then 分数 else 0 end)数学,
 max(case 课程 when '物理' then 分数 else 0 end)物理
from tb group by 姓名

问题是下面的动态sql

declare @sql varchar(500)
set @sql='select 姓名'
select @sql=@sql+',max(case 课程 when '''+课程+''' then 分数 else 0 end)['+课程+']'
from(select distinct 课程 from tb)a
set @sql=@sql+' from tb group by 姓名'
--print(@sql)
exec(@sql)

我真的没体会到他的动态赋值 上面的sql when 后面的是写死的(when语文,数学,物理)

但是我打印出@sql又对了 所以很纳闷

我还原了动态sql语句

select  select 姓名,
           max(case 课程 when '课程' then 分数 else 0 end)课程 from tb group by 姓名
from (select distinct 课程 from tb)

感觉很不对,就是说没有理解他的写法 怎么动态赋值了? 哎 我也不知道说明白了没有

为什么就那么难理解呢,

KyrieYang的主页 KyrieYang | 菜鸟二级 | 园豆:205
提问于:2013-04-10 17:06
< >
分享
所有回答(7)
0

select @sql=@sql+.... from tb

这句话是按行执行的,循环赋值

飞来飞去 | 园豆:2057 (老鸟四级) | 2013-04-10 17:18

能还原成原始的sql吗 

支持(0) 反对(0) KyrieYang | 园豆:205 (菜鸟二级) | 2013-04-10 17:24

@bworling: 啥叫还原成原始sql...不明白...

支持(0) 反对(0) 飞来飞去 | 园豆:2057 (老鸟四级) | 2013-04-10 17:32

@飞来飞去: 

select  

select 姓名 ,max(case 课程 when '''+课程+''' then 分数 else 0 end)['+课程+']

from(select distinct 课程 from tb)a from tb group by 姓名

我根据那个动态的写这样 。。理解了吗 朋友

支持(0) 反对(0) KyrieYang | 园豆:205 (菜鸟二级) | 2013-04-10 17:35

@bworling: 那个写死的sql 是编译器打印出了 一看谁 都知道啊!

支持(0) 反对(0) KyrieYang | 园豆:205 (菜鸟二级) | 2013-04-10 17:38
0

帮顶

zhi++ | 园豆:487 (菜鸟二级) | 2013-04-10 18:49
0

这个我也不明白,同问

淘@淘 | 园豆:602 (小虾三级) | 2013-04-11 09:07
0

不会,求扫盲,只能看懂意思,但是不理解

   

茂茂 | 园豆:2902 (老鸟四级) | 2013-04-11 09:19
0

太混乱了,看不清。

panjk | 园豆:712 (小虾三级) | 2013-07-03 17:27
1

就是一个动态拼接字符串,

有那么难理解吗,

那个select语句就是为了生成

max(case 课程 when'语文'then 分数 else 0 end)语文,

max(case 课程 when '数学' then 分数 else 0 end)数学,

max(case 课程 when '物理' then 分数 else 0 end)物理

这三行字符串

alone__ | 园豆:60 (初学一级) | 2013-08-25 12:10
0
 declare @sql nvarchar(1000)
set @sql='select 姓名'
 select @sql=@sql+' , max(case when 课程='''+课程+''' then grade else 0 end) as '+课程+''
 from (select distinct 课程 from #aa) a
print @sql
 exec (@sql+' from #aa group by 姓名')

你这样写就是对的啦,, 仔细比较一下

t101lian | 园豆:32 (初学一级) | 2013-12-18 16:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册