Mysql 无重复的Sql求和

Mysql 无重复的Sql求和,mysql,sql,group-by,Mysql,Sql,Group By,假设在公司表中有两个公司,公司1和公司2。每个公司有两个项目(项目1-1和项目1-2属于公司1。项目2-1和项目2-2属于公司2)。同样,每个项目有两项费用(共8项费用)。我想列出所有公司,总项目预算和这些公司的总费用。SQL查询(对于mysql)是什么样子的 固定表有两个字段(idfirm和name)。项目表有四个字段(idproject、name、budget和firm_idfirm作为外键)。最后,费用表有三个字段(IdeExpense、amount和project_idproject作为

假设在公司表中有两个公司,公司1和公司2。每个公司有两个项目(项目1-1和项目1-2属于公司1。项目2-1和项目2-2属于公司2)。同样,每个项目有两项费用(共8项费用)。我想列出所有公司,总项目预算和这些公司的总费用。SQL查询(对于mysql)是什么样子的

固定表有两个字段(idfirm和name)。项目表有四个字段(idproject、name、budget和firm_idfirm作为外键)。最后,费用表有三个字段(IdeExpense、amount和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;

但其结果表明,每家公司的费用总额是正确的,但每家公司的预算总额不是。看来预算是重复的。有什么建议吗?

您需要分两步进行聚合。有几种表达方式,下面是我的表达方式

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;

至于为什么
预算
总和错误,想象一下没有
总和
分组依据
的查询结果。对于每个相关的
费用
记录,
项目.预算
值都会重复,但
总和
不考虑这一点。它只是盲目地把它们加在一起,增加了总数。

几乎完全同意:我将把
firm.idfirm
包括在
groupby
中。当然,如果
firm.name
被认为是唯一的,那就没有必要了。@AndriyM-不,你说得对,我很邋遢/懒惰,只是从SELECT子句复制了非聚合。原则上,必须按维度表的主键分组。
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