user_id created_at status amount _____________________________________________ 10196 31-08-2019 15:38 billcreated 21900 10196 05-09-2019 05:40 billpaid 43800 10196 15-12-2019 15:54 billcreated 11200 10205 15-03-2019 16:02 billcreated 2700 10205 31-03-2019 16:02 billcreated 27000 10205 23-04-2019 09:54 billpaid 3000
to get this table i used the query as below
select id,user_id,created_at,status,amount from settlementdata order by user_id,STR_TO_DATE(created_at, '%d-%m-%Y %H:%i');
but now I want to get the table as below
user_id created_at status amount balance ______________________________________________________ 10196 31-08-2019 15:38 billcreated 21900 21900 (as no previous records exits) 10196 05-09-2019 05:40 billpaid 43800 -21900 (balance - paid amount i.e 21900-43800) 10196 15-12-2019 15:54 billcreated 11200 -10700 (balance + bill created amount i.e -21900+11200) 10205 15-03-2019 16:02 billcreated 2700 2700 (as no previous records exits) 10205 31-03-2019 16:02 billcreated 27000 29700 (as 2700+27000) 10205 23-04-2019 09:54 billpaid 3000 26700 (as 29700-3000)
for this i used a query as below
select id, user_id,created_at,status, amount, sum(
    case user_id
        when lag(user_id) over(order by id) = user_id and status = "billcreated"
        then amount
        when lag(user_id) over(order by id) = user_id and status = "billpaid"
        then amount*(-1)
        else 0
        end ) from (select id,user_id,created_at,status,amount from settlementdata
                    order by user_id,STR_TO_DATE(created_at, '%d-%m-%Y %H:%i')
                    limit ) as T;
but still I am unable to get the resulted tab rather I got an error message as UNKNOWN_CODE_PLEASE_REPORT: You cannot use the window function ‘lag’ in this context.
Any help that i can get for the same is highly appreciated.
Thanks in advance
Advertisement
Answer
SELECT *, SUM(CASE WHEN status = 'billcreated' 
                   THEN amount 
                   ELSE -amount 
                   END) OVER (PARTITION BY user_id 
                              ORDER BY STR_TO_DATE(created_at, '%d-%m-%Y %H:%i') ASC) balance
FROM settlementdata