3

我正在使用三张桌子。

  1. AccountingLine - 保存通用帐户详细信息
  2. Budget - 保存每个 AccountingLine 的预算数据(每个 AccountingLine 多行)
  3. 实际 - 保存每个 AccountingLine 的实际成本数据(每个 AccountingLine 多行)

我试图在一个查询中获取结果,该查询将从 AccountingLine 表中返回 ALL ROWS,并从 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 的预算金额的SUM 和每个accounting_line 的实际金额的SUM。

我到处搜索,找不到多个 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
4

3 回答 3

5

Ajoin重复另一个表中的每个匹配行。因此,如果您在三个表中有 3 行并将它们连接在一起,那么您最终会得到 9 行。如果你求和,第二张和第三张表的每个总和都太高了 3 倍。

一种解决方案是在子查询中求和,以便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
于 2012-09-09T06:36:23.647 回答
2

试试这个修改过的,计算它的总数subquery

SELECT  a.*, b.totalBudget, c.totalActual
FROM AccountingLine a LEFT JOIN
        (
        SELECT actg_line_id, SUM(amount) totalBudget
        FROM Budget
        GROUP BY actg_line_id
        ) b on a.act_line_id = b.actg_line_id
    LEFT JOIN
        (
        SELECT actg_line_id, SUM(amount) totalActual
        FROM Actual
        GROUP BY actg_line_id
        ) c on a.act_line_id = c.actg_line_id

SQLFiddle 演示

于 2012-09-09T06:37:20.383 回答
0

试试这个

Select A.* ,SUM(B.Amount) As BudgetAmount,SUM(Act.Amount) As ActualAmount 
from AccountingLine  A
INNER JOIN Budget B 
ON B.budget_id = A.actg_line_id 
INNER JOIN Actual Act 
ON Act.actual_id = A.accounting_line_id  
Grounp By A.accounting_line_id 
于 2012-09-09T06:48:41.170 回答