CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

请问一条SQL语句的写法

楼主yunshiyu(陨石雨)2005-04-03 15:40:37 在 MS-SQL Server / 基础类 提问

有表如:  
  name         num               date             things  
  王健 1 6-15 事假  
  王峰 1 6-6 迟到  
  王力奇 1 5-28 迟到  
  范围 1 5-30 迟到  
  陈雪梅 1 6-21 迟到  
  李国鹏 1 5-28 早退  
  王峰 1 6-4 早退  
  葛洪岩 1 6-24 旷工  
  葛洪岩 1 6-25 旷工  
  张晓丽 1 5-26 旷工  
  。。。  
  。。。  
  需要得到表:  
  姓名:     事假次数       事假日期         迟到次数     迟到日期   早退次数     早退日期   旷工次数     旷工日期  
  王健           1                     6-15            
  王峰                                                     1             6-6  
  葛洪岩                                                                                                                                         2           6-24/6-25  
  。。。。  
  其中   things中的项目名不固定,也就是说要生成的表的列名和列数也不固定  
  请教各位高人,谁有好办法 问题点数:20、回复次数:13Top

1 楼wqhj2000(阿杰)回复于 2005-04-03 16:03:57 得分 0

declare   @txt_sql   varchar(8000)  
  declare   @txt_date   varchar(8000)  
  declare   @txt_things   varchar(8000)  
   
  set   @txt_sql=''  
  set   @txt_date=''  
   
  declare   cursor   c_things  
  for  
  select   distinct   things   from   table  
   
  open   c_things  
  fetch   next   c_things   into   @txt_things  
   
  while   @@state=0  
  begin  
  txt_sql=txt_sql+'sum   (case   things   when'''   +@txt_things+'''then   num)   as   事假次数,'  
   
  fetch   next   c_things   into   @txt_things  
  end    
  close   c_things  
   
  set   txt_sql='select   name,'+txt_sql  
  set   txt_sql=txt_sql   +'from   table   group   by   name'  
     
  =========================  
  以上是思路,未测试。Top

2 楼cmlcsdn(舵手)回复于 2005-04-03 16:04:28 得分 0

首先用游标存储表列things,然后一一取出即可。Top

3 楼yunshiyu(陨石雨)回复于 2005-04-03 16:16:04 得分 0

wqhj2000(阿杰)   :不用试,一定不对  
  写是一定能写出来的,就是想找个比较好的方法,效率尽量高的算法Top

4 楼wqhj2000(阿杰)回复于 2005-04-03 16:20:09 得分 0

我遇到过类似问题,是用游标实现动态SQL的方法。明天到公司把代码帖上来。Top

5 楼doubleming(zsm007)回复于 2005-04-03 17:19:36 得分 0

请问如何得分啊???Top

6 楼sxycgxj(云中客)回复于 2005-04-03 17:38:31 得分 0

select   '事假次数'=  
                    case   things   when   '事假'   then   num  
                    else   ''  
                    end,  
                '事假日期'=  
                  case   things   when   '事假'   then   date  
                    else   ''  
                    end,  
                .........  
   
  以此类推  
  Top

7 楼yunshiyu(陨石雨)回复于 2005-04-04 08:36:42 得分 0

ipTop

8 楼wqhj2000(阿杰)回复于 2005-04-04 10:19:52 得分 20

create   table   test(name   varchar(20),num   int,date   varchar(20),things   varchar(20))  
  go  
  insert   test  
  values('王健', 1, '6-15', '事假')  
  insert   test  
  values('王峰', 1, '6-6', '迟到')  
  insert   test  
  values('王力奇', 1, '5-28', '迟到')  
  insert   test  
  values('范围', 1, '5-30', '迟到')  
  insert   test  
  values('陈雪梅', 1, '6-21', '迟到')  
  insert   test  
  values('李国鹏', 1, '5-28', '早退')  
  insert   test  
  values('王峰', 1, '6-4', '早退')  
  insert   test  
  values('葛洪岩', 1, '6-24', '旷工')  
  insert   test  
  values('张晓丽', 1, '5-26', '旷工')  
  go  
   
   
   
  declare   @txt_sql   varchar(8000)  
  declare   @txt_date   varchar(8000)  
  declare   @txt_things   varchar(8000)  
   
  set   @txt_sql=''  
  set   @txt_date=''  
  set   @txt_things=''  
   
  declare   c_things   cursor    
  for  
  select   distinct   things   from   test  
   
  open   c_things  
  fetch   c_things   into   @txt_things  
   
  while   @@fetch_status=0  
  begin  
  set   @txt_sql=@txt_sql+'sum   (case   things   when   '''   +@txt_things+'''   then   num   else   0   end)   as   '   +@txt_things+'次数,'  
  fetch   c_things   into   @txt_things  
  end    
  close   c_things  
  deallocate   c_things  
   
  set   @txt_sql='select   name,'+substring(@txt_sql,1,len(@txt_sql)-1)  
  set   @txt_sql=@txt_sql   +'   from   test   group   by   name   order   by   name'  
  print   @txt_sql  
  exec   sp_sqlexec   @txt_sql  
  go  
   
  drop   table   test  
  go  
   
  结果:  
  ==========================================  
  name       迟到次数   旷工次数   事假次数   早退次数  
  陈雪梅 1 0 0 0  
  范围 1 0 0 0  
  葛洪岩 0 1 0 0  
  李国鹏 0 0 0 1  
  王峰 1 0 0 1  
  王健 0 0 1 0  
  王力奇 1 0 0 0  
  张晓丽 0 1 0 0  
  =========================================Top

9 楼wqhj2000(阿杰)回复于 2005-04-04 10:31:11 得分 0

还有个方法,不用游标而用递归SELECT完成。  
   
  declare   @txt_sql   varchar(8000)  
  declare   @txt_things   varchar(8000)  
   
  set   @txt_sql=''  
  set   @txt_things=''  
   
  select    
  @txt_things=@txt_things+'sum   (case   things   when   '''+   things   +'''   then   num   else   0   end)   as   '   +things+'次数,'  
  from   test  
  group   by   things  
   
   
  set   @txt_sql='select   name,'+substring(@txt_things,1,len(@txt_things)-1)  
  set   @txt_sql=@txt_sql   +'   from   test   group   by   name   order   by   name'  
  print   @txt_sql  
  exec   sp_sqlexec   @txt_sql  
  go  
  Top

10 楼yunshiyu(陨石雨)回复于 2005-04-04 15:53:10 得分 0

wqhj2000(阿杰)   :你得到的结果不是我想要的,不但有次数,还要有日期啊,次数大于1的项目后面的日期要加到一起的:4-4/4-5  
  Top

11 楼ziping(子平)回复于 2005-04-04 17:09:01 得分 0

建个临时表算了  
  把要的数据导进出Top

12 楼wqhj2000(阿杰)回复于 2005-04-04 17:15:03 得分 0

TO:   yunshiyu(陨石雨)    
  如果要达到“次数大于1的项目后面的日期要加到一起”的目的,在一个批处理里实现可能有点困难,如楼上所说,也许用临时表不失为一个省力的方法。Top

13 楼yunshiyu(陨石雨)回复于 2005-04-05 15:13:13 得分 0

做个临时表,把需要得到的数据一项项更新进去是可以做到的  
  但我想一定有比这更好的办法吧?Top

相关问题

  • sql 语句写法.
  • sql语句写法
  • sql语句写法
  • SQL语句写法。
  • sql语句写法
  • sql语句- 写法!
  • 一条SQL语句的写法
  • 请教一条sql语句的写法。
  • 这条SQL语句的最优写法?
  • 求一条Sql语句的写法

关键词

  • 项目
  • date
  • sql
  • 事假
  • things
  • 旷工
  • txt
  • 迟到
  • 早退
  • 次数

得分解答快速导航

  • 帖主:yunshiyu
  • wqhj2000

相关链接

  • SQL Server类图书

广告也精彩

反馈

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