CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  疑难问题

一个交差表的难题,哪位帮忙看看,怎么解决,给一佰分.

楼主txldm(txldm)2003-04-04 19:51:18 在 MS-SQL Server / 疑难问题 提问

我有两个表:资料如下  
  一.部门表  
  部门编码     部门名称     级别  
  01               管理部             1        
  0101           行政部             2  
  02               生产部             1  
  0201           一车间             2  
  二.出勤表  
      日期               部门       总人数     出勤人数    
  2003-03-01     行政部       50             45  
  2003-03-01     一车间       500           490  
  2003-03-02     行政部       50             45  
  2003-03-02     一车间       500           490  
  2003-03-03     行政部       50             49  
  2003-03-03     一车间       500           498  
  我要得出的结果是如下:请问如果用SQL语句写能否写或者有什么更好的方法,不用程序开发工具.  
                                行政部                           一车间  
  日期                 总人数   出勤人数       总人数       出勤人数  
  2003-03-01         50         45                 500             490  
  2003-03-02         50         45                 500             490  
  2003-03-02         50         49                 500             498 问题点数:0、回复次数:11Top

1 楼Rewiah(乘长风)回复于 2003-04-04 20:11:29 得分 0

可以不用部门表  
   
  declare   @sql   varchar(8000)  
  set   @sql=''  
  select   distinct   部门   into   #temp   from   出勤表  
  select   @sql=@sql+',sum(case   when   部门='''+rtrim(部门)+'''   then   总人数   else   0   end)   as   '+rtrim(部门)+'总人数,sum(case   when   部门='''+rtrim(部门)+'''   then   出勤人数   else   0   end)   as   '+rtrim(部门)+'出勤人数'   from   #temp  
  set   @sql='select   日期'+@sql+'   from   出勤表   group   by   日期   order   by   日期'  
  exec   (@sql)  
  Top

2 楼ben988211(???)回复于 2003-04-04 20:25:28 得分 0

经典Top

3 楼cgsun(colin)回复于 2003-04-04 21:04:36 得分 0

gzTop

4 楼Rewiah(乘长风)回复于 2003-04-04 21:34:38 得分 0

最后加一句:  
  drop   table   #temp  
  Top

5 楼pengdali()回复于 2003-04-04 22:59:35 得分 0

create   table   #部门表   (部门编码   varchar(100),部门名称   varchar(100),级别   int)  
  insert     #部门表   values('01','管理部',         1       )  
  insert     #部门表   values('0101',           '行政部',             2)  
  insert     #部门表   values('02'       ,         '生产部'   ,           1)  
  insert     #部门表   values('0201'     ,       '一车间'     ,         2)  
   
   
  create   table   #出勤表(日期   datetime,部门   varchar(100),总人数   int,出勤人数   int)  
  insert   #出勤表   values('2003-03-01','行政部',       50   ,           45)  
  insert   #出勤表   values('2003-03-01','一车间'   ,     500   ,         490)  
  insert   #出勤表   values('2003-03-02','行政部'     ,   50       ,       45)  
  insert   #出勤表   values('2003-03-02','一车间'       ,500       ,     490)  
  insert   #出勤表   values('2003-03-03','行政部'     ,   50           ,   49)  
  insert   #出勤表   values('2003-03-03','一车间',       500   ,         498)  
   
   
  declare   @sql   varchar(8000)  
  set   @sql=''  
   
  ---如果没有出勤也要列出:  
  select   @sql=@sql+',sum(case   when   部门='''+部门名称+'''   then   总人数   else   0   end)   '+部门名称+'总人数,sum(case   when   部门='''+部门名称+'''   then   出勤人数   else   0   end)   as   '+部门名称+'出勤人数'   from   #部门表  
  exec   ('select   日期'+@sql+'   from   #出勤表   group   by   日期   order   by   日期')  
   
  --如过不列出可以这样:  
  set   @sql=''  
  select   @sql=@sql+',sum(case   when   部门='''+部门+'''   then   总人数   else   0   end)   '+部门+'总人数,sum(case   when   部门='''+部门+'''   then   出勤人数   else   0   end)   as   '+部门+'出勤人数'   from   (select   distinct   部门   from   #出勤表)   aa  
  exec   ('select   日期'+@sql+'   from   #出勤表   group   by   日期   order   by   日期')  
   
   
  go  
  drop   table   #部门表,#出勤表Top

6 楼playyuer(退休干部 卧鼠藏虫)回复于 2003-04-05 00:13:17 得分 0

declare   @sql   varchar(8000)  
  set   @sql=''  
  select   @sql=@sql   +   ',(select   sum(总人数)   from   #出勤表   where   日期   =   T.日期   and   部门   ='''   +   部门     +   ''')   as   '   +   部门   +   '总人数'  
                                    +   ',(select   sum(出勤人数)   from   #出勤表   where   datediff(day,日期,T.日期)   =0   and   部门   ='''   +   部门     +   ''')   as   '   +   部门   +   '出勤人数'  
      from   #出勤表  
  group   by   部门  
  exec   ('select   日期'+@sql+'   from   #出勤表   T   group   by   日期   order   by   日期')  
   
   
  set   @sql=''  
  select   @sql=@sql   +   ',(select   sum(总人数)   from   #出勤表   where   日期   =   T.日期   and   部门   ='''   +   部门名称     +   ''')   as   '   +   部门名称   +   '总人数'  
                                    +   ',(select   sum(出勤人数)   from   #出勤表   where   datediff(day,日期,T.日期)   =0   and   部门   ='''   +   部门名称     +   ''')   as   '   +   部门名称   +   '出勤人数'  
      from   #部门表  
  exec   ('select   日期'+@sql+'   from   #出勤表   T   group   by   日期   order   by   日期')  
   
  --我的答案相对大刀:   效率较低    
  --但   SQL   语法兼容其他数据库较好(可用于不支持Case   when   的数据库语法)  
  --另外可以明确区分   "出勤数的确有记录且是O"和"没有出勤记录Null"   两种情况(总人数同理)!Top

7 楼txldm(txldm)回复于 2003-04-06 17:58:08 得分 0

好,果然是高手!!Top

8 楼benxie(结婚是幸福的!为了老婆努力赚钱!)回复于 2003-04-07 03:58:51 得分 0

高。Top

9 楼txldm(txldm)回复于 2003-04-08 17:50:00 得分 0

我測試之后能用再給分你們   謝謝Top

10 楼zw_sjj(我无知)回复于 2003-04-15 15:56:08 得分 0

可是,我用delphi的dbgrid获得查询结果,怎么只有一列???Top

11 楼vincent_zuo(虬髯客)回复于 2003-05-05 23:10:02 得分 0

请教是否可以在一条sql语句中实现上面的查询?如果可以的化,可以用asp等程序显示,否则就不好弄了。Top

相关问题

  • 什么是交差表?
  • (难题)请问,怎么进行表达式计算?
  • 注册表难题
  • 注册表难题
  • 难题:这个配置文件的正则表达式该怎么写呢?
  • 水晶报表难题
  • 各位,急救呀!关于水晶报表的问题。今晚要交差了。。。。
  • 超级难题,我该怎么办?????????????
  • 难题啊!怎么做这种图片?
  • 难题:请问用PB怎么实现!

关键词

  • sql
  • 部门
  • 总人数
  • 车间
  • 出勤人数
  • 表
  • rtrim
  • 出勤表
  • 行政部
  • 日期

得分解答快速导航

  • 帖主:txldm

相关链接

  • SQL Server类图书

广告也精彩

反馈

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