小编典典

3表联接与SUM和GROUP BY不起作用

sql

我有三个要使用的表。

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

我试图在单个查询中获取结果,该查询将从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

阅读 261

收藏
2021-04-28

共1个答案

小编典典

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
2021-04-28