Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql-多连接_Mysql_Join_Group By - Fatal编程技术网

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