3

使用しているテーブルが3つあります。

  1. AccountingLine-一般的なアカウントの詳細を保持します
  2. 予算-各AccountingLineの予算データを保持します(AccountingLineごとに多くの行)
  3. 実際-各AccountingLineの実際のコストデータを保持します(AccountingLineごとに多くの行)

AccountingLineテーブルからALLROWSを返し、BudgetandActualsテーブルから各AccountingLineの金額を合計する単一のクエリで結果を取得しようとしています。

以下のSQLを使用すると、SUMは予算または実績データに対して機能しません。結合の1つとSUM関数の1つを削除すると、単一の結合テーブルに対して正しく計算されます。非常に奇妙な...MySQLの3つ以上のテーブルで複数の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
4

3 に答える 3

5

は、他のテーブルの一致するjoin各行を繰り返します。したがって、3つのテーブルに3つの行があり、それらを結合すると、最終的に9つの行になります。合計すると、2番目と3番目のテーブルの各合計が3倍高すぎます。

1つの解決策は、サブクエリで合計して、join1つの行だけが見つかるようにすることです。

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 に答える