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
相关产品推荐
相关产品推荐

