CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

■■■简单的交叉查询语句,在线等待...解决就结帐■■■

楼主friendwei(友威)2005-08-17 11:51:33 在 MS-SQL Server / 基础类 提问

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

相关问题

  • 交叉表查询,求sql语句
  • vpf交叉查询语句 do (_genxtab) 编译后不能执行
  • 一个ACCESS2000的交叉查询问题..如何写SQL语句?
  • 高级查询语句--交叉数据报表 的问题
  • 怎么把这个查询语句块转换成一个SQL语句(关于交叉表的)
  • 查询语句
  • 查询语句
  • 查询语句
  • mysql交叉表语句
  • 请大家帮忙写一个较复杂的SQL交叉查询语句,多谢。

关键词

  • 语句
  • 字段
  • sql
  • dayid
  • ckey
  • tempdata
  • emplno
  • 字符串
  • 表
  • 变量

得分解答快速导航

  • 帖主:friendwei
  • lhx1977
  • filebat
  • libin_ftsafe
  • Swanzy
  • dufeng16
  • yaozw_mountain

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo