首页 > 解决方案 > MySQL借方和贷方计算余额的问题

问题描述

我正在使用 MySQL v5.7 我需要计算借方和贷方列的运行余额。提及查询完美运行,但是当我限制 where 条件下的行时,它显示错误值。实际上,它计算所有行的总和,然后显示所需行的结果,但在这种情况下,所需的余额会磨损。这是我获取所有行时有效的查询。

SELECT
    vch.TR_ID,
  vch.TR_CUST_ID,
    vch.TR_DEBIT Debit,
    vch.TR_CREDIT Credit,
    COALESCE ((SELECT SUM(TR_CREDIT) - SUM(TR_DEBIT) FROM  all_trans vch2 WHERE vch2.TR_ID <= vch.TR_ID ),0 ) AS Balance,
    vch.TR_DATETIME DateTime
FROM    `falcondb`.`all_trans` vch
WHERE
vch.TR_DATETIME BETWEEN 
STR_TO_DATE('2020-07-24 11:19:18','%Y-%m-%d %H:%i:%s')AND 
STR_TO_DATE('2020-10-24 11:19:18','%Y-%m-%d %H:%i:%s')
ORDER BY vch.TR_ID;

这是具有 CUST_ID 的事务表,我的主键是 TR_ID 我还有一些其他附加表将与之连接,但在这里它们无关紧要。这就是为什么我没有在这里展示,以使你们变得简单。附上两种情况的屏幕截图。 查询所有行 查询特定的 cust_id


我的子查询实际上做的是:它为表中的所有条目计算它,并且只显示 cust_id=1。那是实际的问题。它必须只计算选定行的余额。它实际上计算所有行并向我显示该结果中的行。下面的截图解释了它

当我为 Cust_id 设置条件时,这实际上是我的查询

标签: mysql

解决方案


如果你想要一个 per TR_CUST_ID-balance,那么你需要在子查询中的那个列上包含一个相关子句:

SELECT
    vch.TR_ID,
    vch.TR_CUST_ID,
    vch.TR_DEBIT Debit,
    vch.TR_CREDIT Credit,
    COALESCE (
        (
            SELECT SUM(TR_CREDIT) - SUM(TR_DEBIT) 
            FROM all_trans vch2 
            WHERE vch2.TR_ID <= vch.TR_ID AND vch2.TR_CUST_ID = vch.TR_CUST_ID
        ),                                  --^-- here
        0 
    ) AS Balance,
    vch.TR_DATETIME DateTime
FROM all_trans vch
WHERE 
    vch.TR_CUST_ID = 1
    AND vch.TR_DATETIME BETWEEN '2020-07-24 11:19:18' AND '2020-10-24 11:19:18'
ORDER BY vch.TR_ID;

请注意,我删除了STR_TO_DATE()表达式:它们不是必需的,因为您拥有的值已经是 MySQL 中完全有效的文字日期。


推荐阅读