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

标签 mysql sql 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 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/

相关文章:

mysql - SQL:指定的键太长

mysql - 这种多对多的数据库结构会是什么样的关系呢?

mysql - 我在哪里可以下载示例 Mysql 数据库?

php - 插入 php sql 之前检查表是否存在

java - 使用ora_rowscn了解每个更改

sql - 使用随机值作为连接条件

sql - 如何在over函数中使用partition by和order by?

mysql - 要求给出正确的徽章并模糊其余的

mysql - 如何在 mySQL 中对动态生成的特定顺序进行排序?

mysql - SQL连接2个表: 1 `ON` vs 2 `ON`