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

