当前位置: 首页 > 面试题库 >

使用MySQL在单个表中根据借方和贷方计算余额

诸葛苏燕
2023-03-14
问题内容

使用下面的MySQL表包含具有相关金额的借方或贷方“操作”,如何选择具有非零“余额”的所有CLIENT_ID?我尝试将表格与自身连接起来以计算所有借方和贷方总计,但某些方法无法正常工作。

CLIENT_ID    ACTION_TYPE    ACTION_AMOUNT
1            debit          1000
1            credit         100
1            credit         500
2            debit          1000
2            credit         1200
3            debit          1000
3            credit         1000
4            debit          1000

我的MySQL查询不起作用:

SELECT 
    client_id,
    SUM(t_debits) AS debits, 
    SUM(t_credits) AS credits, 
    SUM(t_debits)-SUM(t_credits) AS balance
FROM table_name AS t_debits
LEFT JOIN table_name AS t_credits ON t_credits.client_id=t_debits.client_id
WHERE 
    t_debits.action_type='debit'
    AND t_credits.action_type='credit'
    AND balance!=0
GROUP BY t_debits.client_id, t_credits.client_id;

我期望的结果是这样的:

CLIENT_ID    DEBITS    CREDITS    BALANCE
1            1000      600        400
2            1000      1200       -200
4            1000      0          1000

我不知道还有什么可以尝试的。任何帮助将是巨大的。


问题答案:
DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(transaction_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,client_id INT NOT NULL
,action_type VARCHAR(12) NOT NULL
,action_amount INT NOT NULL
);

INSERT INTO my_table(client_id,action_type,action_amount) VALUES
(1            ,'debit',         1000),
(1            ,'credit',         100),
(1            ,'credit',         500),
(2            ,'debit',          1000),
(2            ,'credit',         1200),
(3            ,'debit',          1000),
(3            ,'credit',         1000),
(4            ,'debit',          1000);


SELECT client_id
     , SUM(COALESCE(CASE WHEN action_type = 'debit' THEN action_amount END,0)) total_debits
     , SUM(COALESCE(CASE WHEN action_type = 'credit' THEN action_amount END,0)) total_credits
     , SUM(COALESCE(CASE WHEN action_type = 'debit' THEN action_amount END,0)) 
     - SUM(COALESCE(CASE WHEN action_type = 'credit' THEN action_amount END,0)) balance 
  FROM my_table 
 GROUP  
    BY client_id
HAVING balance <> 0;


+-----------+--------------+---------------+---------+
| client_id | total_debits | total_credits | balance |
+-----------+--------------+---------------+---------+
|         1 |         1000 |           600 |     400 |
|         2 |         1000 |          1200 |    -200 |
|         4 |         1000 |             0 |    1000 |
+-----------+--------------+---------------+---------+


 类似资料:
  • 问题内容: 我有一个SQL Server 2008表,我需要从中选择一个运行余额 我尝试了相关查询 但是我得到了所有的空值。 预期输出为 问题答案: 您需要自加入表。 输出 SQL字段

  • 问题内容: 我有一个包含以下数据的表: 现在,我需要一个查询,该查询给出以下结果: 是否可以通过一个查询而不使用触发器或存储过程来做到这一点? 问题答案: 简短的回答,是的 更长的答案是,您可以使用变量在向下迭代行时对其进行计数,即 将确保在开始之前@Balance被初始化为0。然后,对于每一行,将@Balance设置为,然后输出计算出的值。 同样值得确定的是ORDER是一致的,否则Balance

  • 问题内容: 我想使用GeoDjango或GeoPy根据方向和距离计算一个点。 例如,如果我的点是(-24680.1613,6708860.65389),我想使用Vincenty距离公式找出北1KM,东1KM,苏尔1KM和西1KM的点。 我能找到的最接近的东西是distance.py(https://code.google.com/p/geopy/source/browse/trunk/geopy/

  • 问题内容: 用MySQL计算中位数的最简单方法(希望不是太慢)是什么?我一直在寻找均值,但是我很难找到一种简单的计算中位数的方法。现在,我将所有行返回给PHP,进行排序,然后选择中间行,但是肯定必须有一个简单的方法可以在单个MySQL查询中完成。 示例数据: 排序给出,因此中位数应为,而其中== 。 问题答案: 在MariaDB / MySQL中: 史蒂夫·科恩(Steve Cohen)指出,在第

  • 问题内容: 我需要在sqlite数据库中计算欧几里得距离。 除了编写和加载用于数学函数的动态库外,有人知道如何在sqlite中计算平方根吗? 我快要在这里http://en.wikipedia.org/wiki/Fast_inverse_square_root求助于快速反平方根算法,尽管它可能会变得比我现在需要的更多乐趣。 另外,很高兴弄清楚如何进行幂运算(这是一个普遍的问题,比单独乘以一个数字更

  • 我需要计算一个数字的平方根,例如或。我如何用Python实现它? 输入可能都是正整数,并且相对较小(比如说不到10亿),但万一不是,有什么东西可能会断裂吗? 注:这是在元讨论一个现有的标题相同的问题后,试图提出一个规范问题。 相关的 python中的整数平方根