问题 工作量统计:表1:employeeid name
123 lee
122 zhang
121 wang
124 zhao表2:workwork_id work1 work2 work3 work4
100 123 122 121
101 124 122 121
102 122 123 124 121
103 121 122 123 124
表3:work_simple
work_id work1_s work2_s
1001 122 123
1002 123 124
1003 123 121 输出所有人的工作量:
name work1 work2 work3 work4 work1_s work2_s
姓名 工作量1 工作量2 工作量3 工作量4 工作量5 工作量6 注:工作量——参与某一项工作的次数,如122参与了work2两次,即“工作量2=2”数据库为Oracle9i,有没有比较好的解决方案,因为实际要统计的项目(即到工作量14)有14个,如果一直用union all也可以完成,但是Select语句太庞大了,而且效率也是个问题,

解决方案 »

  1.   

    没搞明白,第一,work1表示工作量,那么下面的122是工作次数还是指id,还有表3是什么意思
    work1_s指什么,还有表2和表3中work_id是一样的吗,表示工作类型?
      

  2.   

    不好意思,没有写清楚。补充一下:表2和表3中的work1何work1_s都是工作类型,对应的如122是工作人员的id,即表示id为122的人员参与了work1_s的工作一次。表2和表3表示不同内容的工作,要统计的就是所有工作人员参与不同工作类型的次数。如:
    name work1 work2 work3 work4 work1_s work2_s 
    lee  1     1     1     0     2       1
      

  3.   

    这个应该不难!先统计works 在和所用户相关联!
      

  4.   

    主要是统计的语句太庞大了,而且效率方面可能比较差,所以想求比较好的解决方案。其实主要是统计works那个语句太庞大了!我的解决方法是下面的,但是只是统计3个的,如果要统计的是14个,岂不是很庞大!
    select id, sum(work1) as 工作量1, sum(work2) as 工作量2, sum(work3) as 工作量3
      from (
            select work1 as id, count(*) as work1, 0 as work2, 0 as work3 
              from work 
             group by work1 
            union all
             select work2 as id, 0 as work1, count(*) as work2, 0 as work3 
              from work 
             group by work2
            union all
             select work3 as id, 0 as work1, 0 as work2, count(*) as work3 
              from work 
             group by work3
             )
     where id is not null and id <> 'null'
     group by id;求比较好的解决方案!!!
      

  5.   

    兄弟,你用union没问题的,这样的语句不算庞大,效率也不会低的,我们的项目,有100多个sql语句的大小都是超过2K的,这很正常的,就是看业务逻辑需要如果说真的要改,你们的表结构设计我看有比较大的改进空间。工作量统计用一张表就可以了,不同的工作种类在这张表中用一个 工作量类型 来区分
      

  6.   

    额,很少写SQL代码,所以觉着庞大,经大家指点,现在明白了,性能也没有什么大的影响。所以就结贴了。