2012-06-06 23 views
1
select ca.cust_ac_no, ca.ccy, ah.trn_dt, 
(SELECT sum(COALESCE(hi.lcy_amount,0))          
    FROM actb_history hi 
    WHERE hi.ac_no='0013001600038' and hi.drcr_ind = 'C' and ah.trn_dt = hi.trn_dt 
    GROUP BY hi.ac_no,hi.drcr_ind) as Total_Credits, 
(SELECT sum(COALESCE(hi.lcy_amount,0))          
    FROM actb_history hi 
    WHERE hi.ac_no='0013001600038' and hi.drcr_ind = 'D'and ah.trn_dt = hi.trn_dt 
    GROUP BY hi.ac_no,hi.drcr_ind) as Total_Debits, 

((SELECT sum(COALESCE(hi.lcy_amount,0))          
    FROM actb_history hi 
    WHERE hi.ac_no='0013001600038' and hi.drcr_ind = 'C' and ah.trn_dt = hi.trn_dt 
    GROUP BY hi.ac_no,hi.drcr_ind) 
    - 
(SELECT sum(COALESCE(hi.lcy_amount,0))          
    FROM actb_history hi 
    WHERE hi.ac_no='0013001600038' and hi.drcr_ind = 'D'and ah.trn_dt = hi.trn_dt 
    GROUP BY hi.drcr_ind,hi.drcr_ind)) as difference 

from actb_history ah, sttm_cust_account ca 
where ah.ac_no='0013001600038' 
and ah.ac_no = ca.cust_ac_no 
group by ca.cust_ac_no, ca.ccy, ah.trn_dt 

上述代碼計算的差只有在存在用於total_credits對應值的總和的差和total_debits找到列值的基礎上的指示器(A/B)列在表

的公式是credit-debit =差額。問題是一些事務只有一個,另一個是空的。因此在添加空值後結果爲空。

我的願望是,它應該顯示爲零的任何空值,並能夠執行減法。

請幫忙。

+0

上有什麼'actb_history'除'「C''和'」 D''交易? –

+0

不,就是這樣。 – Tamseyc

回答

0

試着製作COALESCESUM

2

對於代碼的最小更改,您需要移動具有COALESCE()語句的位置。

而不是在子查詢中,將它們移到子查詢之外。

select ca.cust_ac_no, ca.ccy, ah.trn_dt, 
(SELECT sum(COALESCE(hi.lcy_amount,0))          
    FROM actb_history hi 
    WHERE hi.ac_no='0013001600038' and hi.drcr_ind = 'C' and ah.trn_dt = hi.trn_dt 
    GROUP BY hi.ac_no,hi.drcr_ind) as Total_Credits, 
(SELECT sum(COALESCE(hi.lcy_amount,0))          
    FROM actb_history hi 
    WHERE hi.ac_no='0013001600038' and hi.drcr_ind = 'D'and ah.trn_dt = hi.trn_dt 
    GROUP BY hi.ac_no,hi.drcr_ind) as Total_Debits, 

COALESCE((SELECT sum(hi.lcy_amount)          
    FROM actb_history hi 
    WHERE hi.ac_no='0013001600038' and hi.drcr_ind = 'C' and ah.trn_dt = hi.trn_dt 
    GROUP BY hi.ac_no,hi.drcr_ind), 0) 
    - 
COALESCE((SELECT sum(hi.lcy_amount)          
    FROM actb_history hi 
    WHERE hi.ac_no='0013001600038' and hi.drcr_ind = 'D'and ah.trn_dt = hi.trn_dt 
    GROUP BY hi.drcr_ind,hi.drcr_ind), 0) as difference 

from actb_history ah, sttm_cust_account ca 
where ah.ac_no='0013001600038' 
and ah.ac_no = ca.cust_ac_no 
group by ca.cust_ac_no, ca.ccy, ah.trn_dt 

這是因爲有可能沒有關聯的子查詢記錄SUM()。在那種情況下,你沒有SUM(0),你什麼也沒有(NULL)。因此,將COALESCE()置於子查詢之外,將no records processed變成0

+0

非常感謝,它解決了。現在我可以感受到肩上的負擔。 wheeeew。謝謝 – Tamseyc

+0

你也可以將Sum()包裝在Coalesce()中而不是其他方式。即使沒有匹配的記錄,只返回聚合函數的查詢將始終返回單個行。閱讀也可能更容易。 –

3

它看起來對我來說,一個更簡單的查詢將符合該法案:

select ca.cust_ac_no, ca.ccy, ah.trn_dt, 
     SUM(CASE WHEN ah.drcr_ind='C' THEN ah.lcy_amount ELSE 0 END) as Total_Credits, 
     SUM(CASE WHEN ah.drcr_ind='D' THEN ah.lcy_amount ELSE 0 END) as Total_Debts, 
     SUM(CASE WHEN ah.drcr_ind='C' THEN ah.lcy_amount ELSE 0 END)- 
     SUM(CASE WHEN ah.drcr_ind='D' THEN ah.lcy_amount ELSE 0 END) as Different 
from 
    actb_history ah 
     inner join 
    sttm_cust_account ca 
     on 
     ah.ac_no = ca.cust_ac_no 
where ah.ac_no='0013001600038' 
group by ca.cust_ac_no, ca.ccy, ah.trn_dt 
+0

+1 - 這正是我正在寫的查詢。它擺脫了不需要的subquerys並使用正確的連接。 – Lamak

+0

你可能還想在那裏合併(sum(...),0)。 –

+0

@DavidAldridge - 如果甚至有一個* single *行(它必須用於連接的發生),那麼它就是'1'和'0',而不是'NULL'。 –

相關問題