使用mysql计算每种货币的余额在同一列中的贷方和借方?

时间:2019-06-26 06:42:38

标签: mysql sql

在下面的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 个答案:

答案 0 :(得分:1)

您可以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;

Demo

答案 1 :(得分:0)

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

其余的问题可以(并且应该)在应用程序代码中解决

答案 2 :(得分:0)

仅在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