Mysql 如何使用下面的查询获得每行的余额

Mysql 如何使用下面的查询获得每行的余额,mysql,Mysql,我想得到每个借方和贷方的余额,然后计算每行的余额 SELECT SUM(IF(s.AMT>0 AND s.SLE_CODE=11,s.AMT,0)) AS DEBIT, SUM(IF(s.AMT<0 AND s.SLE_CODE=11,s.AMT,0)) * -1 AS CREDIT FROM sldtl AS s LEFT JOIN transtype ON transtype.TransTypeID = s.TR_CODE WHERE s.SL_BR

我想得到每个借方和贷方的余额,然后计算每行的余额

SELECT SUM(IF(s.AMT>0 AND s.SLE_CODE=11,s.AMT,0)) AS DEBIT,
       SUM(IF(s.AMT<0 AND s.SLE_CODE=11,s.AMT,0)) * -1 AS CREDIT
FROM
  sldtl AS s
LEFT JOIN
  transtype
ON
  transtype.TransTypeID = s.TR_CODE
WHERE
  s.SL_BRCODE= 1 AND s.SL_CLIENTID= 267 AND s.SLC_CODE= 13 AND s.SLT_CODE= 15 AND 
  s.REF_NO= s.REF_NO AND s.TR_DATE >= (SELECT s.TR_DATE FROM sldtl AS s ORDER BY s.TR_DATE DESC LIMIT 1)-INTERVAL 6 MONTH
GROUP BY
  s.TR_DATE DESC, s.TR_CODE, s.TR_CTLNO

让我们考虑一下你的问题的简化版本:

仅包含借方和贷方列的表。您要计算“余额”列:

平衡表:

因此,在您的情况下,它将类似于:

SELECT 
t.DEBIT,
t.CREDIT,
@balance := @balance + t.DEBIT - t.CREDIT AS BALANCE
FROM 
(
    SELECT SUM(IF(s.AMT>0 AND s.SLE_CODE=11,s.AMT,0)) AS DEBIT,
                 SUM(IF(s.AMT<0 AND s.SLE_CODE=11,s.AMT,0)) * -1 AS CREDIT
    FROM
        sldtl AS s
    LEFT JOIN
        transtype
    ON
        transtype.TransTypeID = s.TR_CODE
    WHERE
        s.SL_BRCODE= 1 AND s.SL_CLIENTID= 267 AND s.SLC_CODE= 13 AND s.SLT_CODE= 15 AND 
        s.REF_NO= s.REF_NO AND s.TR_DATE >= (SELECT s.TR_DATE FROM sldtl AS s ORDER BY s.TR_DATE DESC LIMIT 1)-INTERVAL 6 MONTH
    GROUP BY
        s.TR_DATE DESC, s.TR_CODE, s.TR_CTLNO 
) AS t , (SELECT @balance := 0) var;

让我们考虑一下你的问题的简化版本:

仅包含借方和贷方列的表。您要计算“余额”列:

平衡表:

因此,在您的情况下,它将类似于:

SELECT 
t.DEBIT,
t.CREDIT,
@balance := @balance + t.DEBIT - t.CREDIT AS BALANCE
FROM 
(
    SELECT SUM(IF(s.AMT>0 AND s.SLE_CODE=11,s.AMT,0)) AS DEBIT,
                 SUM(IF(s.AMT<0 AND s.SLE_CODE=11,s.AMT,0)) * -1 AS CREDIT
    FROM
        sldtl AS s
    LEFT JOIN
        transtype
    ON
        transtype.TransTypeID = s.TR_CODE
    WHERE
        s.SL_BRCODE= 1 AND s.SL_CLIENTID= 267 AND s.SLC_CODE= 13 AND s.SLT_CODE= 15 AND 
        s.REF_NO= s.REF_NO AND s.TR_DATE >= (SELECT s.TR_DATE FROM sldtl AS s ORDER BY s.TR_DATE DESC LIMIT 1)-INTERVAL 6 MONTH
    GROUP BY
        s.TR_DATE DESC, s.TR_CODE, s.TR_CTLNO 
) AS t , (SELECT @balance := 0) var;

在您的选择末尾添加@balance如何:

SELECT @debit : = SUM(IF(s.AMT>0 AND s.SLE_CODE=11,s.AMT,0)) AS DEBIT,
    @credit := SUM(IF(s.AMT<0 AND s.SLE_CODE=11,s.AMT,0)) * -1 AS CREDIT,
    @balance := @balance - @credit + @debit As BALANCE
FROM sldtl AS s
LEFT JOIN transtype ON transtype.TransTypeID = s.TR_CODE
JOIN (SELECT @balance := 0) AS tmp
WHERE s.SL_BRCODE = 1 
AND s.SL_CLIENTID = 267 
AND s.SLC_CODE = 13 
AND s.SLT_CODE = 15 
AND s.REF_NO = s.REF_NO 
AND s.TR_DATE >= (
    SELECT s.TR_DATE 
    FROM sldtl AS s 
    ORDER BY s.TR_DATE DESC 
    LIMIT 1
) - INTERVAL 6 MONTH
GROUP BY s.TR_DATE DESC, s.TR_CODE, s.TR_CTLNO

PS:我没有阅读SQL的其余部分

那么在选择的末尾添加@balance如何:

SELECT @debit : = SUM(IF(s.AMT>0 AND s.SLE_CODE=11,s.AMT,0)) AS DEBIT,
    @credit := SUM(IF(s.AMT<0 AND s.SLE_CODE=11,s.AMT,0)) * -1 AS CREDIT,
    @balance := @balance - @credit + @debit As BALANCE
FROM sldtl AS s
LEFT JOIN transtype ON transtype.TransTypeID = s.TR_CODE
JOIN (SELECT @balance := 0) AS tmp
WHERE s.SL_BRCODE = 1 
AND s.SL_CLIENTID = 267 
AND s.SLC_CODE = 13 
AND s.SLT_CODE = 15 
AND s.REF_NO = s.REF_NO 
AND s.TR_DATE >= (
    SELECT s.TR_DATE 
    FROM sldtl AS s 
    ORDER BY s.TR_DATE DESC 
    LIMIT 1
) - INTERVAL 6 MONTH
GROUP BY s.TR_DATE DESC, s.TR_CODE, s.TR_CTLNO


PS:我没有阅读您的SQL其余部分

发布您的示例数据,先生,您的意思是什么?这是我上面查询的结果。但是没有余额栏,先生。张贴您的样本数据。先生,您的意思是什么?这是我上面查询的结果。但是没有平衡栏,先生。哦,1000111的答案完全一样:非常感谢您抽出时间,先生。愿上帝永远保佑你DOOPS的回答与1000111完全相同:非常感谢您抽出时间,先生。愿上帝永远保佑你这就是我需要的问题。先生,谢谢你帮助我。愿上帝永远保佑你非常欢迎你。听起来不错,它对你有用。上帝也保佑你。先生,当我尝试替换WHERE s.tru_DATE>=CURDATE时,我注意到,然后按s.tru_DATE删除组中的DESC。“余额”列中的结果将不同。先生,我该怎么做才能更正余额呢?事实上,我没有集中精力回答您的问题。我只是专注于实现您的查询的预期输出。你现在遇到的麻烦可能与这个问题的背景不符。我建议将您的当前情况作为一个单独的问题发布,提供您的模式、示例输入、预期输出和查询。只有这样我们才有希望帮助你。先生,这是我昨天问的问题。是的,这就是我需要的问题。先生,谢谢你帮助我。愿上帝永远保佑你非常欢迎你。听起来不错,它对你有用。上帝也保佑你。先生,当我尝试替换WHERE s.tru_DATE>=CURDATE时,我注意到,然后按s.tru_DATE删除组中的DESC。“余额”列中的结果将不同。先生,我该怎么做才能更正余额呢?事实上,我没有集中精力回答您的问题。我只是专注于实现您的查询的预期输出。你现在遇到的麻烦可能与这个问题的背景不符。我建议将您的当前情况作为一个单独的问题发布,提供您的模式、示例输入、预期输出和查询。只有这样我们才有希望帮助你。先生,这是我昨天问的问题。