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 有对应值的情况下计算差异

公式是贷方-借方=差额。问题是一些交易只有一个,而另一个是空的。所以添加空值后结果为空。

我的愿望是它应该为任何空值显示零并能够执行减法。

请帮忙。

4

3 回答 3

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
于 2012-06-06T13:18:58.677 回答
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.

于 2012-06-06T13:11:21.623 回答
0

尝试制作COALESCE.SUM

于 2012-06-06T13:10:42.747 回答