Skip to Main Content

Breadcrumb

Question and Answer

Connor McDonald

Thanks for the question, Nikhil.

Asked: December 15, 2016 - 6:42 am UTC

Last updated: December 17, 2016 - 2:01 am UTC

Version: 11.2.0

Viewed 1000+ times

You Asked

Hi Chris/Connor,

I have written below SQL to get Difference of Debit & Credit sum (DB version we are using is 11g).
Problem here is I have used two inline views (with similar joins only difference is Bill_Amt_Sign = 1 & Bill_Amt_Sign = 2).

Is there any beyyer way to do this instead going for same tables joins twice.
If you provide any hint, I will try it out. Thanks a lot!!

select DBT.DBAMT - CDT.CRAMT AS Amount
from (select sum(transactionDebit.Bill_Amt) DBAMT
from tb_em_card_transaction transactionDebit,
tb_em_card_demographic_det card
where transactionDebit.Bill_Amt_Sign = '1'
and (
(
transactionDebit.Card_No = card.card_no AND
transactionDebit.Bill_Acc_No = transactionDebit.Txn_Primary_Acc AND
transactionDebit.Memo_Flg = 'N'
)
OR
(
transactionDebit.Txn_Primary_Acc = card.Acc_No and
transactionDebit.Bill_Acc_No != transactionDebit.Txn_Primary_Acc
)
)
and card.Card_No = '123459875'
AND transactionDebit.Txn_Post_Date >= '10/10/2015'
AND transactionDebit.Txn_Post_Date <= '10/10/2016') DBT,
(select sum(transactionCredit.Bill_Amt) CRAMT
from tb_em_card_transaction transactionCredit,
tb_em_card_demographic_det card
where transactionCredit.Bill_Amt_Sign = '2'
and (
(
transactionCredit.Card_No = card.card_no and
transactionCredit.Bill_Acc_No = transactionCredit.Txn_Primary_Acc and
transactionCredit.Memo_Flg = 'N'
)
OR
(
transactionCredit.Txn_Primary_Acc = card.Acc_No and
transactionCredit.Bill_Acc_No != transactionCredit.Txn_Primary_Acc
)
)
and card.Card_No = '123459875'
AND transactionCredit.Txn_Post_Date >= '10/10/2015'
AND transactionCredit.Txn_Post_Date <= '10/10/2016') CDT;

and Connor said...

You can get the superset of the data, and use a CASE expression to sift out the appropriate data. eg

<code>
SELECT
SUM(case when transactionDebit.Bill_Amt_Sign = '1' then transactionDebit.Bill_Amt end) DBAMT -
SUM(case when transactionDebit.Bill_Amt_Sign = '2' then transactionDebit.Bill_Amt end) CDAMT
FROM tb_em_card_transaction transactionDebit,
tb_em_card_demographic_det card
WHERE transactionDebit.Bill_Amt_Sign in ( '1','2')
AND ( ( transactionDebit.Card_No = card.card_no
AND transactionDebit.Bill_Acc_No = transactionDebit.Txn_Primary_Acc
AND transactionDebit.Memo_Flg = 'N' )
OR ( transactionDebit.Txn_Primary_Acc = card.Acc_No
AND transactionDebit.Bill_Acc_No != transactionDebit.Txn_Primary_Acc ) )
AND card.Card_No = '123459875'
AND transactionDebit.Txn_Post_Date >= '10/10/2015'
AND transactionDebit.Txn_Post_Date <= '10/10/2016'

<code>


Rating

  (1 rating)

Is this answer out of date? If it is, please let us know via a Comment

Comments

Perfect!!

A reader, December 16, 2016 - 4:17 am UTC

Thanks Connor.
Just perfect!!
And apology for asking such a stupid questions.
Thanks for your quick help!!
Connor McDonald
December 17, 2016 - 2:01 am UTC

Not a silly question at all !

Glad we could help