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

MySQL WHERE IN聚合查询时如何将多条件统计结果拆为独立行

问题说明

使用MySQL开展ATM交易统计时涉及三张关联表,表结构关系如下:
数据库表结构关系
需求为基于卡号前缀匹配规则,统计A银行、C银行的所有ATM交易数据,期望两个银行各返回一行独立统计结果,预期效果如下:
预期统计结果

当前编写的SQL语句如下:

SELECT
    M.merk AS 'Merk',
    COUNT( T.amount ) AS 'Jumlah Transaksi',
    SUM( T.amount ) AS 'Total Amount'
FROM
    tb_transaksiatm T
INNER JOIN tb_issuer I ON
    T.nomor_kartu LIKE CONCAT(I.prefix, '%')
INNER JOIN tb_terminalatm M ON
    T.terminal = M.nomor_terminal
WHERE
    I.bank IN ('A', 'C') # Declare the Bank;

实际执行后A、C两个银行的交易数据被合并汇总为一行,不符合预期,实际返回结果如下:
错误的单条汇总结果
需要调整查询逻辑,让不同银行的统计结果拆分为独立两行,语句中字段别名使用印尼语。

错误原因

查询缺少分组聚合的GROUP BY子句:使用COUNT、SUM这类聚合函数时,如果不指定分组维度,SQL会把所有符合WHERE条件的记录合并成单条结果做聚合计算。另外原语句SELECT后取的是ATM终端的品牌字段M.merk,不是发卡行维度的字段,本身维度选择就有偏差。

修正方案

按发卡行字段做分组,同时把SELECT里的维度字段替换为发卡行字段即可,修正后的语句如下:

SELECT
    I.bank AS 'Merk',
    COUNT(T.amount) AS 'Jumlah Transaksi',
    SUM(T.amount) AS 'Total Amount'
FROM
    tb_transaksiatm T
INNER JOIN tb_issuer I ON
    T.nomor_kartu LIKE CONCAT(I.prefix, '%')
WHERE
    I.bank IN ('A', 'C')
GROUP BY
    I.bank;

补充说明:如果业务需求需要同时区分发卡银行和交易ATM终端品牌做统计,可以保留对tb_terminalatm表的关联,把分组逻辑调整为GROUP BY I.bank, M.merk;如果仅需要按A、C两家发卡银行维度统计,原语句中关联tb_terminalatm的逻辑属于冗余关联,可以直接移除,降低查询开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:51:18