簡體   English   中英

MySQL查詢結合來自多個表的總和

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM