2015-10-19 60 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

确实如此,谢谢 –