部门和客户一行,每月管理和生产性工作总和

时间:2017-11-08 13:35:50

标签: database oracle

我的SQL查询有问题。 我将通过示例解决我的问题: 我有四张桌子:

表部门:

-----------------
ID   DEPARTMENT
--- -------------
 1  Marketing
 2  IT Department
 3  Human resources
...

表CUSTOMER:

-------------------------
ID   CUSTOMER
--- ---------------------
 1  Coffee world
...

表管理工作

--------------------------
DATE              Customer       Department           SUM_ADMINISTRATION_WORK
----------------- -------------- -------------------- -----------------------
SEP-2017          Coffee world    Marketing                                 25
OCT-2017          Coffee world    Marketing                              11.42
OCT-2017          Coffee world    IT Department                             97
OCT-2017          Coffee world    Human resources                        40.58
...

表生产性工作

-------------------------
DATE              Customer       Department           SUM_PRODUCTIVE_WORK
----------------- -------------- -------------------- -------------------
SEP-2017          Coffee world    Marketing                            115
OCT-2017          Coffee world    IT Department                          5
OCT-2017          Coffee world    Marketing                            160
...

我想为部门和客户显示一行,每月管理和生产工作的总和。

DATE_ACTIVITY     Customer             Department           SUM_ADMINISTRATION_WORK SUM_PRODUCTIVE_WORK EFFORTS_DURATION
----------------- -------------------- -------------------- ----------------------- ------------------- ----------------
SEP-2017          Coffee world          Marketing                                 25                1.91            26.91
OCT-2017          Coffee world          IT Department                             97                 .08            97.08
OCT-2017          Coffee world          Marketing                              11.42                2.66            14.08
...

问题在于我还需要显示部门人力资源,其中生产性工作的总和为0.

DATE_ACTIVITY     Customer             Department           SUM_ADMINISTRATION_WORK SUM_PRODUCTIVE_WORK EFFORTS_DURATION
----------------- -------------------- -------------------- ----------------------- ------------------- ----------------
SEP-2017          Coffee world          Marketing                                 25                1.91            26.91
OCT-2017          Coffee world          IT Department                             97                 .08            97.08
OCT-2017          Coffee world          Marketing                              11.42                2.66            14.08
OCT-2017          Coffee world          Human resources                        40.58                   0            40.58

我使用的查询:

select 
   aw.date_activity,
   c.customer "Customer",
   d.department "Department", 
   SUM(NVL(aw.administration_work,0)) as "SUM_ADMINISTRATION_WORK",
   SUM(NVL(pw.productive_work,0)) as "SUM_PRODUCTIVE_WORK",
   nvl(TRUNC(NVL(aw.administration_work,0) + NVL(pw.productive_work,0),2),0) as "EFFORTS_DURATION"
from customer c
   join (
     select 
       id_customer, 
       id_dep,
       to_char("DATE", 'MON-YYYY') date_activity,
       TRUNC(sum(duration),2) as administration_work
     from 
       administration_work aw
     group by 
        to_char("DATE", 'MON-YYYY'), id_customer, id_dep
   ) aw on c.id = aw.id_customer
   join (
     select 
       id_customer,  
       id_dep,
       to_char("DATE", 'MON-YYYY') date_activity,
       TRUNC(sum(duration),2) as productive_work
     from 
       productive_work pw
     group by 
       to_char("DATE", 'MON-YYYY'), id_customer, id_dep
     ) pw on c.id = pw.id_customer
   join department d on (d.id = aw.id_dep and d.id = pw.id_dep)
   where
       c.id = (select id from customer where customer = 'Coffee world')
       and aw.date_activity = pw.date_activity
   group by aw.date_activity, c.customer, d.department, aw.administration_work, pw.productive_work
   order by aw.date_activity desc, d.department
   ;

你知道如何解决我的问题吗?

感谢您的每一条建议。

1 个答案:

答案 0 :(得分:0)

我没有测试,但试试这个:

select 
   aw.date_activity,
   c.customer "Customer",
   d.department "Department", 
   SUM(NVL(aw.administration_work,0)) as "SUM_ADMINISTRATION_WORK",
   SUM(NVL(pw.productive_work,0)) as "SUM_PRODUCTIVE_WORK",
   nvl(TRUNC(NVL(aw.administration_work,0) + NVL(pw.productive_work,0),2),0) as "EFFORTS_DURATION"
from customer 
   join (
     select 
       id_customer, 
       id_dep,
       to_char("DATE", 'MON-YYYY') date_activity,
       TRUNC(sum(duration),2) as administration_work
     from 
       administration_work aw
     group by 
        to_char("DATE", 'MON-YYYY'), id_customer, id_dep
   ) aw on c.id = aw.id_customer
   join (
     select 
       id_customer,  
       id_dep,
       to_char("DATE", 'MON-YYYY') date_activity,
       TRUNC(sum(duration)/60,2) as productive_work
     from 
       productive_work pw
     group by 
       to_char("DATE", 'MON-YYYY'), id_customer, id_dep
     ) pw on c.id = pw.id_customer
           and aw.date_activity = pw.date_activity
   RIGHT OUTER join department d on (d.id = aw.id_dep and d.id = pw.id_dep)
   where c.id = (select id from customer where customer = 'Coffe world')           
   group by aw.date_activity, c.customer, d.department, aw.administration_work, pw.productive_work
   order by aw.date_activity desc, d.department
   ;