i have a MYSQL database where i want to sort the totals of both paind and unpaid amounts. The Query i used was :
SELECT DISTINCT YEAR( app_payments.created_at ) AS YEARS, SUM( app_payments.amount ) AS Total, app_users.serial, app_payments.`status` AS payment_state FROM app_payments INNER JOIN app_users ON app_payments.created_by = app_users.serial WHERE app_payments.created_by = 'd88faa' GROUP BY YEAR ( app_payments.created_at ), app_payments.status
i got the results as:
2017 1995 d88faa 1 2018 1200 d88faa 1 2019 1250 d88faa 0 2019 4990 d88faa 1
Where 1
stands for PAID
and 0
stand for UNPAID
in my php code, i tried to group the data into years
$Stats = array (); while(!$this->EndofSeek()){ $result = $this->Row(); if($result->payment_state == 0 ){ if(in_array($result->YEARS,$Stats)){ array_replace($Stats,['y'=>$result->YEARS , 'b'=>$result->Total ]); }else{ array_push($Stats,['y'=>$result->YEARS , 'a'=>0 , 'b'=>$result->Total ]);} }else if($result->payment_state == 1){ array_push($Stats,['y'=>$result->YEARS , 'a'=>$result->Total , 'b'=>0 ]); } } return json_encode($Stats)
This returns the output:
[{"y":"2017","a":"1995","b":0}, {"y":"2018","a":"1200","b":0}, {"y":"2019","a":"4990","b":"1450"}, {"y":"2019","a":"4990","b":0}]
Where y
is YEARS
, a
is PAID
and b
is UNPAID
What i seek to achieve is to group all the data to a particular year where i would have
[{"y":"2017","a":"1995","b":0},
{"y":"2018","a":"1200","b":0},
{"y":"2019","a":"4990","b":"1450"}]
Without it duplicating the year but rather merging them into a single unit.
What do i need to do, and which code do i need to implement to achieve this.
Advertisement
Answer
Do you just want conditional aggregation?
SELECT YEAR(p.created_at) AS YEAR, SUM( CASE WHEN p.status = 0 THEN p.amount END) AS Total_0, SUM( CASE WHEN p.status = 1 THEN p.amount END) AS Total_1 FROM app_payments p INNER JOIN app_users u ON p.created_by = u.serial WHERE p.created_by = 'd88faa' GROUP BY YEAR(p.created_at);