2015-10-19 59 views
0

我正在查詢表中上個月的付款總額和帳戶報表。我用下面的查詢要做到這一點總和值乘以記錄數

SELECT DA.ID, DDO.CODE, COALESCE(SUM(FPP.AMOUNT_IN_DEFAULT_CURRENCY),0) AS PAYMENTS,SUM(FAT.AMOUNT_IN_DEFAULT_CURRENCY) as STATEMENTS 
    FROM DIM_ACCOUNT DA 
     JOIN DIM_DATA_OWNER DDO ON DA.DATA_OWNER_ID = DDO.ID 
     LEFT JOIN FACT_AS_TRANSACTION FAT ON DA.ID = FAT.ACCOUNT_ID 
     JOIN DIM_DATE DD ON FAT.VALUE_DATE_ID = DD.ID 
     LEFT JOIN FACT_PAY_PAYMENT FPP ON DA.ID = FPP.ORDERING_ACCOUNT_ID 
     JOIN DIM_PAY_PAYMENT_METHOD DPPM ON FPP.PAYMENT_METHOD_ID = DPPM.ID 
    WHERE DD.CAL_DATE >= TO_DATE('2015-09-19', 'YYYY-MM-DD') 
     AND FPP.CREATION_DATE >= TO_DATE('2015-09-19', 'YYYY-MM-DD') 
     AND DPPM.DIRECT_DEBIT_FLAG = 'N' 
     AND FAT.DEBIT_CREDIT_MARK = 'Debit' 
    GROUP BY DA.ID, DDO.CODE 
    HAVING SUM(FAT.AMOUNT_IN_DEFAULT_CURRENCY) != 0; 

我裝了3個金:用金額2500

付款B帶量2500

付款下與量2000

支付制度

付款金額500

我希望總共需要7500.但是當我執行這個查詢時,我得到了30000.這與7500 * 4(我的支付表中的4條記錄)是一樣的。我想我可能會加入錯誤的事情。問題是什麼?

+0

如果你真的想要LEFT JOIN的我除了常規的內部連接之外,將這些表的條件從WHERE子句移動到ON子句。 – jarlh

+0

您有一個笛卡爾產品發生每個id /代碼組合。解決此問題的最佳方法是在執行「連接」之前進行聚合。 –

回答

0

的地方是打破了左邊,這樣它只是加入
或者,如果你把情況向上到一起,你可以做一個左
兩個和類似的,因爲他們給彼此重複的行很少工作
通過取出組,只是選擇的值,你會看到任何重複
4行FAT會給你FPP
4 rown嘗試爲兩個獨立的,看看你得到正確的答案

SELECT DA.ID, DDO.CODE 
    , COALESCE(SUM(FPP.AMOUNT_IN_DEFAULT_CURRENCY),0) AS PAYMENTS 
    , SUM(FAT.AMOUNT_IN_DEFAULT_CURRENCY)    as STATEMENTS 
    FROM DIM_ACCOUNT DA 
    JOIN DIM_DATA_OWNER DDO 
     ON DA.DATA_OWNER_ID = DDO.ID 
    JOIN FACT_AS_TRANSACTION FAT 
     ON DA.ID = FAT.ACCOUNT_ID 
     AND FAT.DEBIT_CREDIT_MARK = 'Debit' 
    JOIN DIM_DATE DD 
     ON FAT.VALUE_DATE_ID = DD.ID 
     AND DD.CAL_DATE >= TO_DATE('2015-09-19', 'YYYY-MM-DD') 
    JOIN FACT_PAY_PAYMENT FPP 
     ON DA.ID = FPP.ORDERING_ACCOUNT_ID 
     AND FPP.CREATION_DATE >= TO_DATE('2015-09-19', 'YYYY-MM-DD')  
    JOIN DIM_PAY_PAYMENT_METHOD DPPM 
     ON FPP.PAYMENT_METHOD_ID = DPPM.ID  
     AND DPPM.DIRECT_DEBIT_FLAG = 'N'    
GROUP BY DA.ID, DDO.CODE 
HAVING SUM(FAT.AMOUNT_IN_DEFAULT_CURRENCY) != 0; 
+0

確實如此,謝謝 –