2011-12-05 55 views
0

假設我在固定表中有兩個公司1和公司2。每個公司有兩個項目(項目1-1和項目1-2屬於公司1,項目2-1和項目2-2屬於公司2)。同樣,每個項目都有兩項費用(共8項費用)。我想列出所有公司,項目總預算和這些公司的總支出。 SQL查詢(對於mysql)是什麼樣的?沒有重複的Sql總和

公司表有兩個字段(idfirm和name)。項目表有四個字段(idproject,name,budget和firm_idfirm作爲外鍵)。最後費用表有三個字段(idexpense,數量和project_idproject爲外鍵引用項目表的idproject場。)

首先我想這個查詢

select firm.name as Firm, sum(project.budget) as Project, sum(expense.amount) as Expense 
from firm, project, expense 
where firm.idfirm = project.firm_idfirm and project.idproject = expense.project_idproject 
group by firm.name; 

但其結果顯示每家企業的支出這筆款項正確,但每個公司的預算總額不是。看起來預算是重複的。任何建議?

回答

0
select name, pbudget, peamount 
from firm 
     inner join 
     (select firm_idfirm, sum(budget) as pbudget, sum(eamount) as peamount 
     from  project 
        inner join 
        (select id, sum(amount) as eamount 
        from expense 
        group by project_idproject) e 
     on e.project_idproject = project.id 
     group by firm_idfirm) p 
on firm.id = p.firm_idfirm 
2

您需要分兩步進行聚合。有此表現的幾種方法,這裏就是我想表達出來......

SELECT 
    firm.name as Firm, SUM(project.budget) as budget, SUM (expense.expense) AS expense 
FROM 
    firm 
LEFT JOIN 
    project 
    ON firm.idfirm = project.firm_idfirm 
LEFT JOIN 
    (SELECT project_idproject, SUM(amount) AS expense FROM expense GROUP BY project_idproject) AS expense 
    ON project.idproject = expense.project_idproject 
GROUP BY 
    firm.name; 
+0

同意幾乎完全:我會包括''在GROUP BY' firm.idfirm'。當然,如果'firm.name'應該是唯一的,那就沒有必要了。 –

+0

@AndriyM - 不,你說得對,我很怠惰,只是從SELECT子句中複製非聚集。作爲一個原則問題,必須按維度表的PK進行分組。 – MatBailie

0

至於爲什麼budget總和是錯誤的,想象中的查詢結果,而不sumgroup by。對於每個相關的expense記錄重複的值爲project.budget,但sum沒有考慮到該值。它只是盲目地添加它們,誇大了總和。