鉴于这些表的定义和关系:
jobs
tasks
invoice_item
invoice_payment
工作是一切的根源。
每个工作都有多个任务,例如工作可能是 build 一把椅子,任务可能是所需的步骤。每个任务都有一定的计划价格,因此购买椅子的木材可能需要 400。
每个任务都可以通过发票进行计费,发票存储在两个表中,一个表保存发票 ID(invoice_item),另一个表保存发票付款详细信息,例如计费金额和计费任务。
每个任务可以有多个发票,例如我们的任务成本为 400,可以有 4 张发票,每张发票为 100。
要求:
在其自己的行中显示每个作业并包含以下信息:
1. 作业的计划价格总和
2. 已为该工作计费的金额
3.职位描述
我创建了这个 sqlfiddle 来提供基本的数据结构。 http://sqlfiddle.com/#!2/0be74 该数据集的预期结果是:
(job_description, SUM(planned), SUM(billed))
VALUES
('Project A', 2000, 1900),
('Project B', 3000, 2000)
我当前唯一的解决方案严重失败:
Select j.job_description, SUM(t.task_planned_price),SUM(p.invoice_amount)
FROM jobs as j
LEFT JOIN tasks as t ON t.job_id = j.job_id
JOIN invoice_item as i ON i.task_id = t.task_id
JOIN invoice_payment as p ON p.invoice_id = i.invoice_id
GROUP BY j.job_id
我将非常感谢任何关于我做错了什么的指导和一些提示(或答案)。 您可以将我的解决方案直接复制到 sqlfiddle 并查看有什么问题。
提前致谢,很抱歉问了这么长的问题!
最佳答案
当您将任务连接到发票项目和发票付款时,发票金额总和不正确,因为任务行数乘以发票付款行数 * 发票金额行数,您需要将它们单独分组。
select j.job_description, t1.sum_task_planned_price,
coalesce(t2.sum_invoice_amount,0) sum_invoice_amount
from jobs j join (
select job_id, sum(task_planned_price) sum_task_planned_price
from tasks
group by job_id
) t1 on t1.job_id = j.job_id
left join (
select t.job_id, sum(p.invoice_amount) sum_invoice_amount
from tasks t
join invoice_item as i on i.task_id = t.task_id
join invoice_payment as p on p.invoice_id = i.invoice_id
group by t.job_id
) t2 on t1.job_id = t2.job_id
关于mysql - 多重连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25107913/