Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用mysql计算贷方和借方在同一列中的每种货币的余额?_Mysql_Sql - Fatal编程技术网

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

使用mysql计算贷方和借方在同一列中的每种货币的余额?,mysql,sql,Mysql,Sql,下面的MySQL表包含借方或贷方“操作”以及相关的金额和货币,如何选择所有客户ID,每个货币的“余额”?我已经试过了,但有些地方不正常 CLIENT_ID ACTION_TYPE ACTION_AMOUNT Currency 1 debit 1000 USD 1 credit 100 USD 1 credit

下面的MySQL表包含借方或贷方“操作”以及相关的金额和货币,如何选择所有
客户ID
,每个
货币的
“余额”
?我已经试过了,但有些地方不正常

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
我不知道还能尝试什么。任何帮助都会很好

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

在应用程序代码中,可以(也应该)解决其他问题,方法是在
client\u id
上通过
on
on
来执行
GROUP,因为您正在尝试在不同列中“透视”多个货币。您需要使用两级
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

您可以
按客户端id进行分组
包括
条件聚合
,如下所示

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;

谢谢你的回答。但是这个查询显示当所有余额都为零时,我不想看到这样的结果。