我的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
;
你知道如何解决我的问题吗?
感谢您的每一条建议。
答案 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
;