在博客园看了下别人写的文章 遇到了一个问题,不理解如:
这个是写死的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)
感觉很不对,就是说没有理解他的写法 怎么动态赋值了? 哎 我也不知道说明白了没有
为什么就那么难理解呢,
select @sql=@sql+.... from tb
这句话是按行执行的,循环赋值
能还原成原始的sql吗
@bworling: 啥叫还原成原始sql...不明白...
@飞来飞去:
select
select 姓名 ,max(case 课程 when '''+课程+''' then 分数 else 0 end)['+课程+']
from(select distinct 课程 from tb)a from tb group by 姓名
我根据那个动态的写这样 。。理解了吗 朋友
@bworling: 那个写死的sql 是编译器打印出了 一看谁 都知道啊!
帮顶
这个我也不明白,同问
不会,求扫盲,只能看懂意思,但是不理解
太混乱了,看不清。
就是一个动态拼接字符串,
有那么难理解吗,
那个select语句就是为了生成
max(case 课程 when'语文'then 分数 else 0 end)语文,
max(case 课程 when '数学' then 分数 else 0 end)数学,
max(case 课程 when '物理' then 分数 else 0 end)物理
这三行字符串
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 姓名')
你这样写就是对的啦,, 仔细比较一下