declare @sql varchar(8000),@cKey nvarchar(300) set @sql = '' set @cKey = 'dayid'set @sql = 'select distinct '+@ckey+' as col into ##t from ##TempData' exec(@sql)set @sql = 'select emplno' select @sql = @sql + ',sum(case ' + @ckey + ' when '''+ col +''' then sumoperate else 0 end) ['+right(@cKey,2)+']' from ##tdrop table ##tset @sql = @sql+' from ##TempData group by emplno'print @sql exec(@sql) go
declare @sql varchar(8000),@cKey nvarchar(300)set @sql = 'select emplno' set @cKey = 'dayid' set @sql = @sql + ',sum(case ' + @ckey + ' when '''+ @cKey +''' then sumoperate else 0 end) ['+right(@cKey,2)+'] from (select distinct dayid from ##TempData ) as a'
set @sql = @sql+' from ##TempData group by emplno'print @sql --exec(@sql) --go
to Swanzy: 就这个问题挺烦人的,搞得云里雾里,哪有心情帮你顶咯,现在自己搞定了,怎么顶都行啦。嘿嘿..
上面语句: select @sql = @sql + ',sum(case ' + @ckey + ' when '''+ dayid +''' then sumoperate else 0 end) ['+right(@cKey,2)+']' from (select distinct dayid from ##TempData ) as a
select @sql = @sql+' from ##TempData group by emplno'dayid 改成 @ckey 参数要dayid 改成参数,在运行时指定字段, 简单一点:字段范围确定, 可以在dayid位置替换成 case @ckey when 'dayid' then dayid when '...' then ....cast(.as varchar)....end否则要动态执行,用 sp_executesql 形如:EXEC sp_executesql @s, N'@r varchar(400) OUTPUT',@c1s OUTPUT 意思不明确,最初的目的是什么? 问题应集中在: ',sum(case ' + @ckey + ' when '''+ dayid +''' then sumoperate else 0 end) ['+right(@cKey,2)+']'的处理上。在字符串连接上应注意变量类型和目标字符串sql语句中常量/变量对应关系, 特别是涉及字符串。这应该应在纵横转换上。
set @sql = ''
set @cKey = 'dayid'set @sql = 'select distinct '+@ckey+' as col into ##t from ##TempData'
exec(@sql)set @sql = 'select emplno'
select @sql = @sql + ',sum(case ' + @ckey + ' when '''+ col +''' then sumoperate else 0 end) ['+right(@cKey,2)+']'
from ##tdrop table ##tset @sql = @sql+' from ##TempData group by emplno'print @sql
exec(@sql)
go
set @cKey = 'dayid'
set @sql = @sql + ',sum(case ' + @ckey + ' when '''+ @cKey +''' then sumoperate else 0 end) ['+right(@cKey,2)+'] from (select distinct dayid from ##TempData ) as a'
set @sql = @sql+' from ##TempData group by emplno'print @sql
--exec(@sql)
--go
就这个问题挺烦人的,搞得云里雾里,哪有心情帮你顶咯,现在自己搞定了,怎么顶都行啦。嘿嘿..
select @sql = @sql + ',sum(case ' + @ckey + ' when '''+ dayid +''' then sumoperate else 0 end) ['+right(@cKey,2)+']'
from (select distinct dayid from ##TempData ) as a
select @sql = @sql+' from ##TempData group by emplno'dayid 改成 @ckey 参数要dayid 改成参数,在运行时指定字段,
简单一点:字段范围确定,
可以在dayid位置替换成 case @ckey when 'dayid' then dayid when '...' then ....cast(.as varchar)....end否则要动态执行,用 sp_executesql
形如:EXEC sp_executesql @s, N'@r varchar(400) OUTPUT',@c1s OUTPUT 意思不明确,最初的目的是什么?
问题应集中在:
',sum(case ' + @ckey + ' when '''+ dayid +''' then sumoperate else 0 end) ['+right(@cKey,2)+']'的处理上。在字符串连接上应注意变量类型和目标字符串sql语句中常量/变量对应关系,
特别是涉及字符串。这应该应在纵横转换上。
就是读取一个月内每天的收入的数据,把天数(1-31)转成横向的列,考虑到将此功能通用性,而不仅中只是适应某一个表或某一字段,所以才来这里发贴将其中固定的字段 dayId 换成 @cKey 的方式来提高其通用性。我最后解决的方法:
因为在此过程中,我用了一个临时表 ##TempData ,而临时表的列就可能变得到很灵活,可以是其它的表,也可以是其它不同于 dayid 的字段名,只要在写入到 ##TempData 时,将其对应关键的字段但名字不是为 dayid 的字段的别名设为 dayid
感谢各位的热情帮助!!!