我有以下查询试图生成所有客户的列表、他们的项目、在每个项目上花费的时间、总发票金额和发票总数。
SELECT
c.name as client,
p.name as project,
SUM(t.hours) as hours,
SUM(ci.amount) as invoice_amount,
COUNT(ci.id) as number_invoices
FROM
projects p
INNER JOIN client_master c ON c.harvest_id = p.client_id
INNER JOIN timesheet t ON t.project_id = p.id
LEFT OUTER JOIN projects_contracts pc ON pc.project_id = p.id
INNER JOIN contracts_invoices ci ON ci.contract_id = pc.contract_id
GROUP BY
c.name,
p.name
ORDER BY
c.name,
p.name,
t.hours
当我运行查询时,“小时数”计算正确,但 invoice_amount 和 number_invoices 的总和/计数并未根据上下文连接到项目,而是连接到表中的发票总数。如果我注释掉其中一个 sum(),那么我会得到正确的值,但当它们都在时则不会。
预期结果
客户 A,项目 1、1000、10,000 美元、2
客户 A,项目 2,5000,5000 美元,1
客户 B,项目 1,100,3000 美元,1
实际结果
客户 A,项目 1, 1000, $150,000, 20
客户 A,项目 2,5000,50,000 美元,81
客户 B,项目 1、100、83000 美元、12
我试过搞乱分组和连接语句,但没有成功。有没有什么简单的东西我忽略了或者我需要完全重写?
最佳答案
由于发票依赖于契约(Contract),而契约(Contract)是可选的(左连接), 使该连接也成为左连接。
SELECT
c.name as client,
p.name as project,
SUM(t.hours) as hours,
SUM(ci.amount) as invoice_amount,
COUNT(ci.id) as number_invoices
FROM
projects p
INNER JOIN client_master c
ON c.harvest_id = p.client_id
INNER JOIN timesheet t
ON t.project_id = p.id
LEFT JOIN projects_contracts pc
ON pc.project_id = p.id
LEFT JOIN contracts_invoices ci
ON ci.contract_id = pc.contract_id
GROUP BY
c.name,
p.name
ORDER BY
c.name,
p.name,
t.hours
关于MySQL 查询组合来自多个表的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44956567/