2017-07-06 93 views
1

我有以下查询试图生成所有客户端,他们的项目,花在每个项目上的时间,总开票金额和发票总数的列表。MySQL查询组合来自多个表的总和

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计数不被上下文加入到该项目,但在表发票的总数。如果我注释掉总和的一个()的话,我得到了应有的价值,但是当他们都在不。

预期结果

客户端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

I”我已经尝试搞乱了分组和加入陈述,但没有找到成功。有没有简单的我可以忽略或者我需要一个完全重写?

+0

见(HTTP [为什么要我为了什么,在我看来是一个非常简单的SQL查询提供MCVE]: //meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query) – Strawberry

+0

帮助我在这里,我大规模缩小了这个查询。你还期望看到什么? – markjrubin

+0

如果两个和数都存在并且不正确,那么这些值与从哪一个中取出值不同?正确的值是高于还是低于不正确的值? –

回答

-1

这可能不是最好的方式,但我敢打赌,它的工作原理

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 
+0

这似乎已经做到了。它产生了几个空发票金额的项目,但没关系,因为我可以在那里。现在...尝试将其余的公式丢回.... – markjrubin

0

由于发票依赖于合同,并且合同是可选的(左连接),所以 使得该连接也是左连接。

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 
+0

谢谢斯隆。当我这样做之前,我得到了以下消息MySQL说:文档 #1104 - SELECT将检查超过MAX_JOIN_SIZE行;检查你的WHERE并且使用SET SQL_BIG_SELECTS = 1或者SET MAX_JOIN_SIZE =#如果SELECT是好的 – markjrubin

+0

表中有多少行?什么是MAX_JOIN_SIZE设置为?你有没有尝试改变它? –

+0

我在查询的开始处添加了SET SQL_BIG_SELECT = 1语句。这次它产生了一个结果,但数据仍然不正确。我得到客户,项目,148.92,142956.00,54当我应该收到客户,项目,148.92,$ 10,000,3 – markjrubin