Итого с группой в MySql - PullRequest
       2

Итого с группой в MySql

0 голосов
/ 02 октября 2018

Я пытаюсь получить текущий баланс выплат в таблице, которая будет отображаться в списке транзакций.Сумма каждой выплаты слева и промежуточная сумма (накопленный остаток) справа.

Вот мой запрос:

SELECT *, SUM(payment_sum) as total, @running_total := @running_total
 + payment_sum AS cumulative_sum FROM payments JOIN
(SELECT @running_total := 0)t WHERE id=? 
GROUP BY source, report_date;

Payment_sum и cumulative_sum (промежуточная сумма)исправить, если я не сгруппировать по источникам и report_date.Тогда сумма payment_sum верна, а промежуточный итог - нет.Мне нужно сгруппировать по источнику и report_date, так как платеж из одного и того же источника может происходить в одну и ту же дату, поэтому я хотел бы сгруппировать все платежи из одного источника, чтобы они не отображались дважды.Это приводит к тому, что промежуточный итог дает ложный баланс.похоже, что только первая группа источников суммируется.

вывод без группировки источников (правильный баланс):

Source   date      payout  balance
Google   10/18/18    $5.00  $ 5.00
Google   10/18/18    $5.00  $10.00
Amazon   10/18/18    $2.50  $12.50
Amazon   10/18/18    $2.50  $15.00
WebStore 10/18/18    $2.00  $17.00 

вывод с источником группировки (неправильный баланс):

Source   date      payout  balance
Google   10/18/18    $10.00  $ 5.00
Amazon   10/18/18    $ 5.00  $ 7.50
WebStore 10/18/18    $ 2.00  $ 9.50 

Желаемый результат: (источник, дата отчета сгруппирована)

Source   date      payout  balance
Google   10/18/18    $10.00  $10.00
Amazon   10/18/18    $ 5.00  $15.00
WebStore 10/18/18    $ 2.00  $17.00  

Есть идеи, как лучше отформатировать мой запрос для желаемых результатов?

1 Ответ

0 голосов
/ 02 октября 2018

Попробуйте использовать набор результатов операции group by в Производной таблице , а затем вычислите текущий баланс.

Также обратите внимание, что я правильно выполнил Псевдоним для ясности кода (удобочитаемости) и избежания неоднозначных операций.

Попробуйте следующее:

SELECT dt.*, 
       @running_total := @running_total + dt.total AS cumulative_sum 
FROM (
      SELECT t1.*, 
             SUM(t1.payment_sum) as total 
      FROM payments AS t1 
      WHERE t1.id = ? 
      GROUP BY t1.source, t1.report_date 
     ) AS dt 
CROSS JOIN (SELECT @running_total := 0) AS t2 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...