Hello friends, i got one interesting query from some source which i thought to share with you. I want output as follows, how can you write query for that !
We have two tables as bellow:

OUTPUT:- I want total as per credit and debit value from table.

Now first try yourself without looking for solution. You will learn something new if you try yourself, otherwise i will definitely help you out ๐ย Following is my query which will return above OUTPUT:
CREATE TABLE #ACCT ( userid int,username varchar(50)) INSERT #ACCT ([userid], [username]) VALUES (1, 'AMI') INSERT #ACCT ([userid], [username]) VALUES (2, 'Aesha') INSERT #ACCT ([userid], [username]) VALUES (3, 'Seema') CREATE TABLE #Trans ( transactionid int,transactiondate datetime,CreditDebit varchar(50),userid int) INSERT #Trans ([transactionid], [transactiondate], [CreditDebit], [userid]) VALUES (1, '2015-12-08 18:54:11.793', '10000', 1) INSERT #Trans ([transactionid], [transactiondate], [CreditDebit], [userid]) VALUES (2, '2015-12-08 18:54:43.030', '-5000', 1) INSERT #Trans ([transactionid], [transactiondate], [CreditDebit], [userid]) VALUES (3, '2015-12-08 18:55:14.293', '2000', 2) INSERT #Trans ([transactionid], [transactiondate], [CreditDebit], [userid]) VALUES (4, '2015-12-08 18:55:49.053', '3000', 3) INSERT #Trans ([transactionid], [transactiondate], [CreditDebit], [userid]) VALUES (5, '2015-12-08 18:55:49.053', '2000', 1) GO with results (username, Credit, Dedit,transactionid) AS ( select A.username, case when sign(T.CreditDebit)=1 then CreditDebit else ''end 'Credit', case when sign(T.CreditDebit)=-1 then CreditDebit else ''end 'Dedit', T.transactionid from #ACCT A inner join #Trans T on A.userid=T.userid ) select username,credit,replace(Dedit,'-','')as Dedit, SUM(CASE WHEN sign(credit)=1 THEN cast(credit as int) ELSE cast( Dedit as int) END ) OVER (PARTITION BY username ORDER BY transactionid ) As Total from results
You can also try your own and forward it to me. Try any built in function or anything, but try to solve it with different query. I would like to see different queries for one output.
Try your own queries in Sql Fiddleย and share it as comment.
Don’t forget to share your views.
Thanks ๐
Nice! Couple of things.. The CReditDebit is an Amount field and it should be in MONEY not VARCHAR. Replacing -1 is not a good solution.I have modified the script and logic a little bit..
Reference http://sqlindia.com/calculate-cumulative-sum-of-previous-rows-sql-server/
CREATE TABLE #ACCT ( userid int,username varchar(50))
INSERT #ACCT ([userid], [username]) VALUES (1, ‘AMI’)
INSERT #ACCT ([userid], [username]) VALUES (2, ‘Aesha’)
INSERT #ACCT ([userid], [username]) VALUES (3, ‘Seema’)
–Changed the CreditDebit datatype to MONEY. VARCHAR is not a real time scenario
CREATE TABLE #Trans ( transactionid int,transactiondate datetime,CreditDebit money,userid int)
INSERT #Trans ([transactionid], [transactiondate], [CreditDebit], [userid]) VALUES (1, ‘2015-12-08 18:54:11.793’, ‘10000’, 1)
INSERT #Trans ([transactionid], [transactiondate], [CreditDebit], [userid]) VALUES (2, ‘2015-12-08 18:54:43.030’, ‘-5000’, 1)
INSERT #Trans ([transactionid], [transactiondate], [CreditDebit], [userid]) VALUES (3, ‘2015-12-08 18:55:14.293’, ‘2000’, 2)
INSERT #Trans ([transactionid], [transactiondate], [CreditDebit], [userid]) VALUES (4, ‘2015-12-08 18:55:49.053’, ‘3000’, 3)
INSERT #Trans ([transactionid], [transactiondate], [CreditDebit], [userid]) VALUES (5, ‘2015-12-08 18:55:49.053’, ‘2000’, 1)
SELECT
a.username
, t.transactiondate
, case when sign(t.CreditDebit)=1 then CreditDebit else NULL end ‘Credit’
, case when sign(t.CreditDebit)=-1 then CreditDebit else NULL end ‘Dedit’
, SUM(t.CreditDebit) OVER(PARTITION BY t.userid ORDER BY t.transactiondate ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS OUTSTANDING_BALANCE
FROM #Trans t
INNER JOIN #ACCT a ON a.userid = t.userid
ORDER BY t.userid, t.transactiondate
Awesome solution..
It is very useful for all learner.
Its very useful for me.
good
Awesome!!!!!!!!
Very useful query which is given desired result .