[英]MySQL query combining sums from multiple tables
我有以下查詢,試圖生成所有客戶,他們的項目,在每個項目上花費的時間,總發票金額和總發票數的列表。
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,$ 5,000,1
客戶B,項目1,100,$ 3000,1
實際結果
客戶A,項目1,1000,$ 150,000,20
客戶A,項目2,5000,$ 50,000,81
客戶B,項目1、100、83000美元,12
我試過弄亂w /的分組和聯接語句,但沒有找到成功。 我有什么簡單的事情要忽略嗎?還是需要全部重寫?
由於發票取決於合同,並且合同是可選的(左聯接),因此使該聯接也成為左聯接。
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
這可能不是最好的方法,但是我敢打賭
SELECT
c.name as client,
p.name as project,
t.hours as hours,
ci.amount as invoice_amount,
ci.count as number_invoices
FROM
projects p
INNER JOIN client_master c
ON c.harvest_id = p.client_id
INNER JOIN (SELECT project_id, SUM(hours) AS hours FROM timesheet GROUP BY project_id) t
ON t.project_id = p.id
LEFT OUTER JOIN projects_contracts pc
ON pc.project_id = p.id
LEFT OUTER JOIN (SELECT contract_id, SUM(amount) AS amount, COUNT(DISTINCT id) AS count FROM contracts_invoices GROUP BY contract_id) ci
ON ci.contract_id = pc.contract_id
GROUP BY
c.name,
p.name
ORDER BY
c.name,
p.name,
t.hours
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.