используя mysql рассчитать баланс каждой валюты, где кредит и дебет в одном столбце? - PullRequest
1 голос
/ 26 июня 2019

С помощью следующей таблицы MySQL, содержащей «действия» по дебету или кредиту со связанными суммами и валютой, как можно выбрать все CLIENT_IDs с ненулевым "balance" каждого currency? Я пытался, но что-то не работает правильно.

CLIENT_ID    ACTION_TYPE    ACTION_AMOUNT    Currency
1            debit          1000                USD
1            credit         100                 USD
1            credit         500                 DR
2            debit          1000                EURO
2            credit         1200                DR
3            debit          1000                EURO
3            credit         1000                USD
4            debit          1000                USD

Мой запрос MySQL, который не работает:

SELECT client_id,
       SUM(if(action_type='credit',action_amount,0)) as credit,
       SUM(if(action_type='debit',action_amount,0 )) as debit,
       SUM(if(currency='USD' ,action_type='credit'- action_type='debit' )) as USD_balance,
       SUM(if(currency='EURO',action_type='credit'- action_type='debit' )) as EURO_balance,
       SUM(if(currency='DR'  ,action_type='credit'- action_type='debit' )) as DR_balance
  FROM my_table
 GROUP BY client_id,currency

Результат, который я ожидаю, выглядит примерно так:

CLIENT_ID    USD_Balance    EURO_Balance    DR_Balance
1              -900             0              500
2                0            -1000            1200
3              1000           -1000             0
4             -1000              0              0

Понятия не имею, что еще попробовать. Любая помощь будет великолепна.

Ответы [ 3 ]

1 голос
/ 26 июня 2019

Вы можете Group By client_id, включая Conditional Aggregation, как показано ниже

SELECT client_id,
       SUM(case when action_type = 'credit' then action_amount else 0 end) as credit,
       SUM(case when action_type = 'debit'  then action_amount else 0 end) as debit,
       SUM(case
             when currency = 'USD' and action_type = 'credit' then
              action_amount else 0
           end) - SUM(case
                        when currency = 'USD' and action_type = 'debit' then
                         action_amount
                        else 0
                      end) as USD_balance,
       SUM(case
             when currency = 'EURO' and action_type = 'credit' then
              action_amount else 0
           end) - SUM(case
                        when currency = 'EURO' and action_type = 'debit' then
                         action_amount
                        else 0
                      end) as EUR_balance,
       SUM(case
             when currency = 'DR' and action_type = 'credit' then
              action_amount
             else 0
           end) - SUM(case
                        when currency = 'DR' and action_type = 'debit' then
                         action_amount
                        else 0
                      end) as DR_balance
  FROM my_table
 GROUP BY client_id;

Демо

0 голосов
/ 26 июня 2019

Делайте GROUP BY только на client_id, так как вы пытаетесь "развернуть" несколько валют в разных столбцах. Вам нужно будет использовать два уровня операторов If() для вычисления баланса.

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

SELECT CLIENT_ID,
       SUM(IF(Currency = 'USD', IF(ACTION_TYPE = 'credit', ACTION_AMOUNT, -ACTION_AMOUNT), 0)) AS USD_Balance, 
       SUM(IF(Currency = 'EURO', IF(ACTION_TYPE = 'credit', ACTION_AMOUNT, -ACTION_AMOUNT), 0)) AS EURO_Balance, 
       SUM(IF(Currency = 'DR', IF(ACTION_TYPE = 'credit', ACTION_AMOUNT, -ACTION_AMOUNT), 0)) AS DR_Balance
    FROM my_table
    GROUP BY CLIENT_ID
0 голосов
/ 26 июня 2019
SELECT client_id   
     , currency
     , SUM(CASE WHEN action_type = 'debit' THEN action_amount * -1 ELSE action_amount END) balance 
  FROM my_table
 GROUP
    BY client_id
     , currency

Остальная проблема может (и должна) быть решена в коде приложения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...