SQL如何基于现有列的不同值拆分生成独立结果列
实现方案
这是典型的行转列需求,直接用条件判断即可实现,对应两种常见业务场景的SQL写法如下:
场景1:保留原查询逐行返回粒度,仅拆分类型为独立列
不需要合并记录,只是把原查询里的Request类型值拆成两个独立金额列,当前行匹配对应类型时列显示金额,不匹配则列值为0,直接用CASE WHEN做逐行判断即可:
SELECT UpdateDate AS DATE, Username, CASE WHEN Request = 'Successfull' THEN AmountUSD ELSE 0 END AS SuccessfullAmount, CASE WHEN Request = 'Declined' THEN AmountUSD ELSE 0 END AS DeclinedAmount FROM tgm.tr_active WHERE Request IN ('Successfull','Declined');
场景2:同日期、同用户的记录合并为一行,两类金额分开展示
如果需要把同一个UpdateDate、同一个Username下的成功、拒绝交易汇总到同一行,在条件判断的基础上搭配聚合函数,按非金额字段分组即可:
SELECT UpdateDate AS DATE, Username, SUM(CASE WHEN Request = 'Successfull' THEN AmountUSD ELSE 0 END) AS SuccessfullAmount, SUM(CASE WHEN Request = 'Declined' THEN AmountUSD ELSE 0 END) AS DeclinedAmount FROM tgm.tr_active WHERE Request IN ('Successfull','Declined') GROUP BY UpdateDate, Username;
注意事项
- 写判断条件时,
'Successfull'的拼写要和表中实际存储的枚举值完全一致,不要自行修正为常规正确拼写Successful,否则会出现匹配不到数据的问题。 - 聚合函数可以根据实际业务需求替换:如果不需要求和,也可以换成
MAX()/MIN()取对应类型的最大/最小金额值。
内容的提问来源于stack exchange,提问作者George Papadopoulos
相关产品推荐
相关产品推荐

