■■■简单的交叉查询语句,在线等待...解决就结帐■■■
declare @sql varchar(8000),@cKey nvarchar(300)
set @sql = 'select emplno'
set @cKey = 'dayid'
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'
print @sql
exec(@sql)
go
以上的语句是正常有效的,现在我想把以上语句中出现的的 dayid 都改成 @ckey ,这样就方便做成过程时传递参数了,如何改呢?
问题点数:50、回复次数:13Top
1 楼lhx1977(清水无鱼)回复于 2005-08-17 11:56:01 得分 5
@ckey 是一个变量,你把dayid 替换成@ckey,再显示一下你组合在一起的字符串是不你想要的,就可以了。多测试几下
Top
2 楼friendwei(友威)回复于 2005-08-17 11:59:36 得分 0
就是试了多没试出来,才跑这来问的呀Top
3 楼klan(因帅被判7年)回复于 2005-08-17 11:59:40 得分 0
什么意思啊?Top
4 楼friendwei(友威)回复于 2005-08-17 14:15:49 得分 0
快来人呀...Top
5 楼filebat(Mark)回复于 2005-08-17 14:39:36 得分 10
用executesql就可以了。
不过,这样要拼接两次,有点复杂。
没有测试环境很容易出错。
你还是把##TempData表的结构贴出来吧,顺便加点测试数据
Top
6 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-08-17 15:36:09 得分 10
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 ##t
drop table ##t
set @sql = @sql+' from ##TempData group by emplno'
print @sql
exec(@sql)
goTop
7 楼Swanzy(平淡)回复于 2005-08-17 15:41:54 得分 0
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
Top
8 楼Swanzy(平淡)回复于 2005-08-17 15:43:45 得分 10
楼主看了俺的帖,不帮忙顶一顶,不厚道,嘿嘿~Top
9 楼friendwei(友威)回复于 2005-08-17 16:10:17 得分 0
to Swanzy:
就这个问题挺烦人的,搞得云里雾里,哪有心情帮你顶咯,现在自己搞定了,怎么顶都行啦。嘿嘿..
Top
10 楼dufeng16()回复于 2005-08-17 16:20:22 得分 5
好难,我还没有看明白呢??
明白了一定给楼主回复.Top
11 楼yaozw_mountain(山林)回复于 2005-08-17 17:52:55 得分 10
上面语句:
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语句中常量/变量对应关系,
特别是涉及字符串。
这应该应在纵横转换上。
Top
12 楼prcgolf(小鸟)回复于 2005-08-18 09:16:39 得分 0
upTop
13 楼friendwei(友威)回复于 2005-08-18 11:15:27 得分 0
我的想法:
就是读取一个月内每天的收入的数据,把天数(1-31)转成横向的列,考虑到将此功能通用性,而不仅中只是适应某一个表或某一字段,所以才来这里发贴将其中固定的字段 dayId 换成 @cKey 的方式来提高其通用性。
我最后解决的方法:
因为在此过程中,我用了一个临时表 ##TempData ,而临时表的列就可能变得到很灵活,可以是其它的表,也可以是其它不同于 dayid 的字段名,只要在写入到 ##TempData 时,将其对应关键的字段但名字不是为 dayid 的字段的别名设为 dayid
感谢各位的热情帮助!!!Top




