我有三个要使用的表。
我试图在单个查询中获取结果,该查询将从AccountingLine表返回所有行,并从Budget和Actuals表中求和每个AccountingLine的金额。
使用下面的SQL,SUM不适用于预算或实际数据。如果删除联接之一和SUM函数之一,则它将为单个联接表正确计算。非常奇怪…在MySQL的三个或更多表上有人通过多个SUM函数遇到这个问题吗?
SELECT A.*, SUM(B.`amount`) AS BudgetAmount, SUM(ACT.`amount`) as ActualAmount FROM accounting_line A LEFT JOIN budget B ON B.accounting_line_id = A.accounting_line_id LEFT JOIN actual ACT ON ACT.accounting_line_id = A.accounting_line_id GROUP BY A.`accounting_line_id`
通过发布上面的声明,我希望看到accounting_line字段,每个accounting_line的预算金额之和和每个accounting_line的实际金额之和。
我到处搜索,找不到多个SUM函数的实例。非常感谢您的任何建议。
乔希
表数据如下:
Table: AccountingLine act_line_id department ---------------------------------- 1 Sales 2 HumanResources Table: Budget budget_id actg_line_id amount ---------------------------------------------- 1 1 3500.00 2 2 5000.00 3 2 15000.00 Table: Actual actual_id actg_line_id amount ---------------------------------------------- 1 1 1000.00 2 2 500.00 3 2 9000.00
Ajoin重复另一个表中的每个匹配行。因此,如果在三个表中有3行并将它们连接在一起,则最终将有9行。如果求和,第二张和第三张表的每个和都太高3倍。
join
一种解决方案是对子查询求和,以使join唯一的查询找到一行:
SELECT A.* , B.SumAmount as BudgetAmount , ACT.SumAmount as ActualAmount FROM accounting_line A LEFT JOIN ( select accounting_line_id , sum(amount) as SumAmount from budget group by accounting_line_id ) as B ON B.accounting_line_id = A.accounting_line_id LEFT JOIN ( select accounting_line_id , sum(amount) as SumAmount from actual group by accounting_line_id ) as ACT ON ACT.accounting_line_id = A.accounting_line_id