mysql-多连接
鉴于这些表格的定义和关系:mysql-多连接,mysql,join,group-by,Mysql,Join,Group By,鉴于这些表格的定义和关系: jobs tasks invoice_item invoice_payment 工作是一切的根源。 每个作业都有多个任务,例如,该作业可能正在制作椅子,而任务可能是所需的步骤。每项任务都有一定的计划价格,因此为椅子购买木材可能需要400美元 每个任务都可以通过发票开票,发票存储在两个表中,一个表保存发票id(发票项目),另一个表保存发票付款详细信息,如要开票的金额和要开票的任务 每个任务可以有多张发票,例如,我们的任务成本为400,每个任务可以有4张
jobs
tasks
invoice_item
invoice_payment
工作是一切的根源。每个作业都有多个任务,例如,该作业可能正在制作椅子,而任务可能是所需的步骤。每项任务都有一定的计划价格,因此为椅子购买木材可能需要400美元 每个任务都可以通过发票开票,发票存储在两个表中,一个表保存发票id(发票项目),另一个表保存发票付款详细信息,如要开票的金额和要开票的任务 每个任务可以有多张发票,例如,我们的任务成本为400,每个任务可以有4张100的发票 要求: 使用以下信息在自己的行中显示每个作业:
1.作业的计划价格总和
2.已为该作业开具账单的金额
3.工作描述 我创建了这个SQLFIDLE来提供基本的数据结构。 此数据集的预期结果为:
(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
根据您的样本数据验证工作,尝试使其足够简单,以帮助理解
select jobs.job_id,
jobs.job_description,
sum(invoice_amount),
PP.PPSUM
from jobs,
tasks,
invoice_payment,
invoice_item,
(select job_id, sum(task_planned_price) as PPSUM from tasks group by job_id) as PP
where jobs.job_id = tasks.job_id
and invoice_item.task_id = tasks.task_id
and invoice_payment.invoice_id = invoice_item.invoice_id
and PP.job_id = jobs.job_id
group by jobs.job_id