简体   繁体   English

MySQL查询结合来自多个表的总和

[英]MySQL query combining sums from multiple tables

I have the following query that is trying to generate a list of all clients, their projects, time spent on each project, total invoiced amount and total number of invoices. 我有以下查询,试图生成所有客户,他们的项目,在每个项目上花费的时间,总发票金额和总发票数的列表。

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

When I run the query, the "hours" are being calculated correctly but the sums/counts for invoice_amount and number_invoices aren't being joined contextually to the project but to the total number of invoices in the table. 当我运行查询时,“小时”被正确计算,但是invoice_amount和number_invoices的总和/计数不是根据上下文与项目关联的,而是与表中发票总数的关联。 If I comment out one of the sum()'s then I get the proper value but not when they're both in. 如果我注释掉sum()的其中之一,那么我会得到正确的值,但是当它们都在其中时,则不会。

Expected Results 预期成绩

Client A, Project 1, 1000, $10,000, 2 客户A,项目1,1000,$ 10,000,2

Client A, Project 2, 5000, $5,000, 1 客户A,项目2,5000,$ 5,000,1

Client B, Project 1, 100, $3000, 1 客户B,项目1,100,$ 3000,1

Actual Results 实际结果

Client A, Project 1, 1000, $150,000, 20 客户A,项目1,1000,$ 150,000,20

Client A, Project 2, 5000, $50,000, 81 客户A,项目2,5000,$ 50,000,81

Client B, Project 1, 100, $83000, 12 客户B,项目1、100、83000美元,12

I've tried messing w/ the grouping and join statements but haven't found success. 我试过弄乱w /的分组和联接语句,但没有找到成功。 Is there something simple I'm overlooking or do I need a total rewrite? 我有什么简单的事情要忽略吗?还是需要全部重写?

Since invoices are dependant on contracts, and contracts are optional (the left join), make that join also a left join. 由于发票取决于合同,并且合同是可选的(左联接),因此使该联接也成为左联接。

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

This may not be the best way, but I bet it works 这可能不是最好的方法,但是我敢打赌

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