我需要计算job_id的总成本,包括工资和配件成本。 我只设法计算一个。我需要通过job_id来计算工资和配件成本。
staff_on_job表(FK:staff_id,job_id)
配件表
job_fittings表(FK:job_id,fitting_name)
计算每个job_id的工资
select job_id ,sum(hours*30)from staffs_on_job group by job_id;
输出
计算每个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;
输出
使用工资和装修成本计算job_id总成本的查询是什么?可以将两个查询的总和相加吗?
答案 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,那么结果将完全为空。