You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL多账户余额求和:实现余额列互斥显示零值需求

解决方案

你可以通过在窗口函数外层嵌套CASE语句,根据当前交易的类型控制余额列的显示内容,实现互斥效果。同时优化SQL的连接方式和排序逻辑,提升代码可读性和正确性:

SET @nmr = 0;
SELECT
    @nmr := @nmr + 1 AS `No.`,
    d.id_transaksi AS `ID`,
    d.tgl_transaksi AS `DATE`,
    e.tipe_transaksi AS `TRANSACTION_CODE`,
    FORMAT(d.debit, 0, 'id_ID') AS `DEBIT`,
    FORMAT(d.kredit, 0, 'id_ID') AS `CREDIT`,
    -- 仅当交易类型为SS时显示BALANCE A的累计值,否则显示0
    CASE 
        WHEN e.tipe_transaksi = 'SS' THEN 
            FORMAT(SUM(d.debit - d.kredit) OVER (
                PARTITION BY d.id_anggota, e.tipe_transaksi 
                ORDER BY d.tgl_transaksi 
                ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
            ), 0, 'id_ID')
        ELSE '0'
    END AS `BALANCE A`,
    -- 仅当交易类型为SW时显示BALANCE B的累计值,否则显示0
    CASE 
        WHEN e.tipe_transaksi = 'SW' THEN 
            FORMAT(SUM(d.debit - d.kredit) OVER (
                PARTITION BY d.id_anggota, e.tipe_transaksi 
                ORDER BY d.tgl_transaksi 
                ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
            ), 0, 'id_ID')
        ELSE '0'
    END AS `BALANCE B`
FROM history_transaksi d
INNER JOIN tipe_transaksi e 
    ON e.tipe_transaksi = d.tipe_transaksi
WHERE d.id_anggota = 21
ORDER BY d.tgl_transaksi ASC;

关键修改说明

  • 互斥显示逻辑:通过CASE判断当前交易的TRANSACTION_CODE,仅匹配对应类型时展示计算出的累计余额,否则输出格式化后的0。
  • 窗口函数优化:将PARTITION BY的条件从e.tipe_transaksi = "SS"改为d.id_anggota, e.tipe_transaksi,更精准地按用户+交易类型分组计算累计余额,避免逻辑歧义。
  • 显式连接:用INNER JOIN替代隐式连接,代码结构更清晰,符合现代SQL编写规范。
  • 排序修正:直接使用原表字段d.tgl_transaksi排序,避免因别名引用导致的字符串排序问题(原语句中ORDER BY "DATE" ASC会被解析为按字符串"DATE"排序,而非日期列)。

内容的提问来源于stack exchange,提问作者Kenneth Sabandar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 14:05:16