给定这些表定义和关系:

jobs
tasks
invoice_item
invoice_payment

工作是一切的根源。
每个作业都有多个任务,例如,该作业可能正在构建椅子,任务可能是所需的步骤。每项任务都有一定的计划价格,所以买椅子的木头要花400英镑。
每个任务都可以通过发票进行计费,发票存储在两个表中,一个表包含发票id(发票项目),而另一个表包含发票付款详细信息,如待付金额和待付任务。
每个任务可以有多个发票,因此例如,我们的成本为400的任务可以有4个发票,每个发票为100。
要求:
使用以下信息显示自己行中的每个作业:
一。工作计划价格之和
2。已为该作业计费的金额
三。工作描述
我创建这个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

http://sqlfiddle.com/#!2/0be74/8

关于mysql - mysql-多个联接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25107913/

10-13 06:54