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

请细心的高手帮一个忙,涉及到4个表,汇总查询!!分数不够再加!!!!!!!!!!!!

楼主openxyj(爱我所爱,想我所想)2005-02-03 12:37:35 在 MS-SQL Server / 基础类 提问

表1(duty)  
      工号       初始日期         旷工时数  
    001           05-01-01               0  
    001           05-01-02               1  
    002           05-01-01               0  
    002           05-01-02               0  
    003           05-01-01               0  
   
  表2   (employee)  
    工号       姓名       部门代号  
    001         张三       b1  
    002         李4         b1  
    003         王5         b2    
  表3   (department)  
    部门代号       部门名称  
      b1                   管理部    
      b2                     MIS    
   
   
  表4(   holidays)---请假表  
  工号         日期               请假时数       双休日请假(bit)     年休假(bit)  
  001           05-01-01           2                       0                           0                     '双休日和年休假为0时为'日常请假'  
  002           05-01-02           2                       1                           0      
   
   
  我想要的结果是:  
      工号     姓名     部门名称     记录数       旷工时数         日常请假汇总     双休日请假     年休假  
      001       张三       管理部           2                   1                         2                           0                     0  
      002       李4         管理部           2                   0                         0                           2                   0          
      003       王5         MIS                 1                   0                         0                           0                   0  
   
   
   
   
  各位高手请帮忙呀!!!急呀!!!!!!!!  
   
  问题点数:35、回复次数:12Top

1 楼openxyj(爱我所爱,想我所想)回复于 2005-02-03 12:54:59 得分 0

upTop

2 楼microwind8888(风)回复于 2005-02-03 13:05:55 得分 0

帮你upTop

3 楼openxyj(爱我所爱,想我所想)回复于 2005-02-03 13:40:58 得分 0

高手帮忙呀,小弟不慎感激!!Top

4 楼zjcxc(邹建)回复于 2005-02-03 14:17:13 得分 10

 
  select   e.工号,e.姓名  
  ,d.部门名称  
  ,记录数=case   when   b.工号   is   null   then   0   else   1   end  
  +case   when   c.工号   is   null   then   0   else   1   end  
  ,旷工时数=isnull(b.旷工时数,0)  
  ,日常请假汇总=isnull(c.日常请假汇总,0)  
  ,双休日请假=isnull(c.双休日请假,0)  
  ,年休假=isnull(c.年休假,0)  
  from   employee   e  
  join   department   d   on   e.部门代号=d.部门代号  
  left   join(  
  select   工号  
  ,旷工时数=sum(旷工时数)  
  from   duty  
  group   by   工号  
  )b   on   e.工号=b.工号  
  left   join(  
  select   工号  
  ,日常请假汇总=sum(请假时数)-sum(双休日请假)-sum(年休假)  
  ,双休日请假=sum(双休日请假)  
  ,年休假=sum(年休假)  
  from   holidays  
  group   by   工号  
  )c   on   e.工号=c.工号  
   
   
  Top

5 楼wwg_yuyin(向生命贷款)回复于 2005-02-03 14:22:05 得分 0

帮你先顶,等下来收分,呵呵Top

6 楼openxyj(爱我所爱,想我所想)回复于 2005-02-03 14:40:56 得分 0

TO:       zjcxc(邹建)    
               
   
      运行结果    
  服务器:   消息   409,级别   16,状态   2,行   1  
  sum   or   average   aggregate   运算不能以   bit   数据类型作为参数。  
  服务器:   消息   409,级别   16,状态   1,行   1  
  sum   or   average   aggregate   运算不能以   bit   数据类型作为参数。  
  服务器:   消息   409,级别   16,状态   1,行   1  
  sum   or   average   aggregate   运算不能以   bit   数据类型作为参数。  
  服务器:   消息   409,级别   16,状态   1,行   1  
  sum   or   average   aggregate   运算不能以   bit   数据类型作为参数。  
  Top

7 楼zjcxc(邹建)回复于 2005-02-03 15:07:13 得分 0

 
  select   e.工号,e.姓名  
  ,d.部门名称  
  ,记录数=case   when   b.工号   is   null   then   0   else   1   end  
  +case   when   c.工号   is   null   then   0   else   1   end  
  ,旷工时数=isnull(b.旷工时数,0)  
  ,日常请假汇总=isnull(c.日常请假汇总,0)  
  ,双休日请假=isnull(c.双休日请假,0)  
  ,年休假=isnull(c.年休假,0)  
  from   employee   e  
  join   department   d   on   e.部门代号=d.部门代号  
  left   join(  
  select   工号  
  ,旷工时数=sum(cast(旷工时数   as   int))  
  from   duty  
  group   by   工号  
  )b   on   e.工号=b.工号  
  left   join(  
  select   工号  
  ,日常请假汇总=sum(cast(请假时数   as   int))-sum(cast(双休日请假   as   int))-sum(cast(年休假   as   int))  
  ,双休日请假=sum(cast(双休日请假   as   int))  
  ,年休假=sum(cast(年休假   as   int))  
  from   holidays  
  group   by   工号  
  )c   on   e.工号=c.工号  
   
   
   
  Top

8 楼openxyj(爱我所爱,想我所想)回复于 2005-02-03 15:35:36 得分 0

现产生的结果如下:  
   
  工号           姓名             部门                 记录数         旷工时数   日常请假汇总   双休日请假   年休假  
   
  001             张三             管理部         2 1 2     0 0  
  002             李4               管理部         2 0 1     1 0  
  003             王5               MIS               1 0 0     0 0  
   
   
   
  zjcxc(邹建)兄,再麻烦你看一下!!!!!!  
  Top

9 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-02-03 15:36:03 得分 0

SELECT  
          a.工号,  
          a.姓名,  
          b.部门名称,  
          记录数               =   isnull(c.记录数,0),  
          旷工时数           =   isnull(c.旷工时数),  
          日常请假汇总   =   isnull(d.日常请假汇总),  
          双休日请假       =   isnull(d.双休日请假),  
          年休假               =   isnull(d.年休假)  
  FROM  
          employee       a  
  INNER   JOIN  
          department   b  
  ON  
          a.部门代号   =   b.部门代号  
  LEFT   JOIN  
          (SELECT   工号,COUNT(旷工时数)   AS   记录数,SUM(旷工时数)   AS   旷工时数   FROM   duty   GROUP   BY   工号)   c  
  ON  
          a.工号   =   c.工号  
  LEFT   JOIN  
          (SELECT    
                    工号,  
                    SUM(CASE   WHEN   (双休日请假   =   0   AND   年休假   =   0)   THEN     请假时数   ELSE   0   END)   AS   日常请假汇总  
                    SUM(CASE   WHEN   (双休日请假   =   1)                                 THEN     请假时数   ELSE   0   END)   AS   双休日请假  
                    SUM(CASE   WHEN   (年休假   =   1)                                         THEN     请假时数   ELSE   0   END)   AS   年休假  
          FROM    
                    holidays)   d  
  ON  
          a.工号   =   d.工号  
  ORDER   BY  
          a.工号Top

10 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-02-03 15:36:27 得分 0

SELECT  
          a.工号,  
          a.姓名,  
          b.部门名称,  
          记录数               =   isnull(c.记录数,0),  
          旷工时数           =   isnull(c.旷工时数),  
          日常请假汇总   =   isnull(d.日常请假汇总),  
          双休日请假       =   isnull(d.双休日请假),  
          年休假               =   isnull(d.年休假)  
  FROM  
          employee       a  
  INNER   JOIN  
          department   b  
  ON  
          a.部门代号   =   b.部门代号  
  LEFT   JOIN  
          (SELECT   工号,COUNT(旷工时数)   AS   记录数,SUM(旷工时数)   AS   旷工时数   FROM   duty   GROUP   BY   工号)   c  
  ON  
          a.工号   =   c.工号  
  LEFT   JOIN  
          (SELECT    
                    工号,  
                    SUM(CASE   WHEN   (双休日请假   =   0   AND   年休假   =   0)   THEN     请假时数   ELSE   0   END)   AS   日常请假汇总  
                    SUM(CASE   WHEN   (双休日请假   =   1)                                 THEN     请假时数   ELSE   0   END)   AS   双休日请假  
                    SUM(CASE   WHEN   (年休假   =   1)                                         THEN     请假时数   ELSE   0   END)   AS   年休假  
          FROM    
                    holidays)   d  
  ON  
          a.工号   =   d.工号  
  ORDER   BY  
          a.工号Top

11 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-02-03 15:46:12 得分 20

楼上的有误,修改如下:  
   
  --生成测试数据  
  create   table   duty(  
  工号                       varchar(20),  
  初始日期               varchar(20),  
  旷工时数               int  
  )  
   
   
  insert   into   duty   values('001','05-01-01',0)  
  insert   into   duty   values('001','05-01-02',1)  
  insert   into   duty   values('002','05-01-01',0)  
  insert   into   duty   values('002','05-01-02',0)  
  insert   into   duty   values('003','05-01-01',0)  
   
  create   table   employee(  
  工号               varchar(20),  
  姓名               varchar(20),  
  部门代号       varchar(20)  
  )  
   
  insert   into   employee   values('001','张三','b1')  
  insert   into   employee   values('002','李4   ','b1')  
  insert   into   employee   values('003','王5   ','b2')    
   
  create   table   department(  
  部门代号               varchar(20),  
  部门名称               varchar(20)  
  )  
  insert   into   department   select   'b1','管理部'    
  insert   into   department   select   'b2','MIS'  
   
   
  create   table   holidays(  
  工号               varchar(20),  
  日期               varchar(20),  
  请假时数       int,  
  双休日请假   bit,      
  年休假           bit)  
   
  insert   into   holidays   select   '001','05-01-01',2,0,0--'双休日和年休假为0时为'日常请假'  
  insert   into   holidays   select   '002','05-01-02',2,1,0      
   
   
  --执行查询  
  SELECT  
          a.工号,  
          a.姓名,  
          b.部门名称,  
          记录数               =   isnull(c.记录数,0),  
          旷工时数           =   isnull(c.旷工时数,0),  
          日常请假汇总   =   isnull(d.日常请假汇总,0),  
          双休日请假       =   isnull(d.双休日请假,0),  
          年休假               =   isnull(d.年休假,0)  
  FROM  
          employee       a  
  INNER   JOIN  
          department   b  
  ON  
          a.部门代号   =   b.部门代号  
  LEFT   JOIN  
          (SELECT   工号,COUNT(旷工时数)   AS   记录数,SUM(旷工时数)   AS   旷工时数   FROM   duty   GROUP   BY   工号)   c  
  ON  
          a.工号   =   c.工号  
  LEFT   JOIN  
          (SELECT    
                    工号,  
                    SUM(CASE   WHEN   (双休日请假   =   0   AND   年休假   =   0)   THEN     请假时数   ELSE   0   END)   AS   日常请假汇总,  
                    SUM(CASE   WHEN   (双休日请假   =   1)                                 THEN     请假时数   ELSE   0   END)   AS   双休日请假,  
                    SUM(CASE   WHEN   (年休假   =   1)                                         THEN     请假时数   ELSE   0   END)   AS   年休假  
          FROM    
                    holidays  
          GROUP   BY  
                    工号)   d  
  ON  
          a.工号   =   d.工号  
  ORDER   BY  
          a.工号  
  Top

12 楼jialiuer()回复于 2005-02-03 16:54:05 得分 5

select   table3.工号,   table3.姓名,   table3.部门名称,   table3.记录数,   table3.旷工时数,   table4.请假时数,   table4.双休日请假,     table4.年休假   from    
  (  
  select   table1.工号,     table2.姓名,table2.部门名称,   table1.记录数,   table1.旷工时数   from    
  (  
  select   工号,   count(*)   as   记录数,   sum(旷工时数)   as   旷工时数   from   duty  
  group   by   工号  
  )   as   table1,  
  (  
  select   employee.工号,   employee.姓名,   department.部门名称  
  from   employee,department  
  where   employee.部门代号=department.部门代号  
  )   as   table2  
  where   table1.工号=table2.工号  
  )   as   table3,  
  (  
  (  
  select   employee.工号,holidays.请假时数,   holidays.双休日请假,     holidays.年休假    
  from   employee,   holidays    
  where   employee.工号=holidays.工号  
  )  
  union   all  
  (  
  select   工号,   0   as   请假时数,   0   as   双休日请假,   0   as   年休假    
  from   employee    
  where   工号   not   in   (select   工号   from   holidays)    
  ))   as   table4  
  where   table3.工号=table4.工号  
   
  Top

相关问题

  • 分组查询汇总
  • 急■急■急■单表的汇总查询
  • 求查询结果汇总的方法!!
  • 学生分数在线查询系统
  • 这样的汇总查询可不可以实现?
  • 如何取得query查询后汇总的数据
  • 急!!!分类汇总查询如何设计?
  • 脑壳短路了,求查询汇总语句
  • 求多表间的查询汇总语句!!
  • 这样的汇总查询应如何写?

关键词

  • 管理
  • 服务器
  • 数据
  • 消息
  • 工号
  • 请假
  • 休假
  • 日常请假汇总
  • isnull
  • 代号

得分解答快速导航

  • 帖主:openxyj
  • zjcxc
  • libin_ftsafe
  • jialiuer

相关链接

  • SQL Server类图书

广告也精彩

反馈

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