Mysql 无重复的Sql求和
假设在公司表中有两个公司,公司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字段的外键引用) 首先,我尝试了这个查询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作为
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