从两个查询中计算总和?

时间:2014-12-18 13:26:15

标签: sql database oracle join oracle-sqldeveloper

我需要计算job_id的总成本,包括工资和配件成本。 我只设法计算一个。我需要通过job_id来计算工资和配件成本。

staff_on_job表(FK:staff_id,job_id)

Staff_on_job table

配件表

Fittings

job_fittings表(FK:job_id,fitting_name)

job_fittings

计算每个job_id的工资

select job_id ,sum(hours*30)from staffs_on_job group by job_id;

输出

wages

计算每个job_id的总拟合成本

select jf.job_id ,sum(f.cost) 
from jobs_fittings jf left OUTER JOIN fittings f
on( jf.FITTING_NAME = f.FITTING_NAME)
group by jf.JOB_ID;

输出

enter image description here

使用工资和装修成本计算job_id总成本的查询是什么?可以将两个查询的总和相加吗?

2 个答案:

答案 0 :(得分:1)

最好的方法是将查询分解为两个简单的查询,然后将它们连接在一起。这个解决方案假设一个工作总是有人在工作但可能没有任何装配成本(因此从工资到配件的左连接)。实际上这是架构设计的一个缺陷,因为应该有一个工作表(可能有一个你没有包含在你的例子中),你可以将工资和配件加入到工作表中。

WITH  job_wage_costs AS
(
   SELECT   job_id,
            SUM(hours) * 30 AS wage_costs
   FROM     staff_on_job
   GROUP BY job_id
),
job_fitting_costs AS (
   SELECT   job_id,
            SUM(COST) AS fitting_costs
   FROM     job_fittings jf
   JOIN     fittings f ON (f.fitting_name = jf.fitting_name)
   GROUP BY job_id
)
SELECT   jw.job_id,
         jw.wage_costs,
         jf.fitting_costs
FROM     job_wage_costs jw
LEFT OUTER JOIN job_fitting_costs jf ON (jf.job_id = jw.job_id);

JOB_ID   WAGE_COSTS  FITTING_COSTS 
1        60          20
2        480         164.99
6        1200        199.99
12       1200        320.98
9        90 

顺便说一句,配件表的设计可以改变,因为它不是normalized design。通过在每一行中重现拟合类型,您很难在将来更改这些拟合类型的措辞,因为您需要更改每一行 - 它们应该在fitting_type表中,然后可以将其连接到配件。 / p>

答案 1 :(得分:0)

最简单的解决方案是加入您的2个查询:

select A.job_id, A.wages,B.fittingcost, total = A.wages + B.fittingcost
from (
       select job_id ,sum(hours*30) wages from staffs_on_job group by job_id
     ) A
     join (
       select jf.job_id ,sum(f.cost) fittingcost
       from jobs_fittings jf left OUTER JOIN fittings f
       on( jf.FITTING_NAME = f.FITTING_NAME)
       group by jf.JOB_ID
     ) B on (A.job_id = B.job_id)

请注意,当2个表中的一个不包含您正在查找的job_id时,上述情况将无法正确处理;如果其中一个表不包含该job_id,那么结果将完全为空。