我正在处理三张 table 。

  • AccountingLine - 保存通用帐户详细信息
  • 预算 - 保存每个 AccountingLine 的预算数据(每个 AccountingLine 有很多行)
  • Actual - 保存每个 AccountingLine 的实际成本数据(每个 AccountingLine 有很多行)

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

    最佳答案

    join 重复另一个表中的每个匹配行。因此,如果您在三个表中有 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
    

    关于mysql - 3 表加入 SUM 和 GROUP BY 不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12337037/

    10-10 19:35