SQL按id分组行转列:将月份与订单指标拼接为列的实现问题
问题解决方法
问题根源
你添加GROUP BY后仅返回单条记录数据的核心原因是:CASE 语句未搭配聚合函数使用。
分组操作执行时,数据库默认只会取每个分组内的第一行数据返回,非聚合类的字段不会自动合并多行的结果,你写的CASE逻辑在第一行不匹配月份时就直接返回0,后续行的有效数值不会被捕获。
修正后的SQL语句
SELECT id, MAX(CASE WHEN order_month = '2021-07' THEN order_count ELSE 0 END) as `2021-07_order_count`, MAX(CASE WHEN order_month = '2021-07' THEN order_sum ELSE 0 END) as `2021-07_order_sum`, MAX(CASE WHEN order_month = '2021-08' THEN order_count ELSE 0 END) as `2021-08_order_count`, MAX(CASE WHEN order_month = '2021-08' THEN order_sum ELSE 0 END) as `2021-08_order_sum`, MAX(CASE WHEN order_month = '2021-09' THEN order_count ELSE 0 END) as `2021-09_order_count`, MAX(CASE WHEN order_month = '2021-09' THEN order_sum ELSE 0 END) as `2021-09_order_sum` FROM orders GROUP BY id ORDER BY id
说明
- 这里使用
MAX()聚合函数,会提取同个id下所有行对应月份的最大有效值,规避了首行非匹配月份返回0的问题。如果你的业务中存在同一个id同一个月有多条订单记录的场景,把MAX()替换为SUM()即可自动累加当月的订单总量和总金额。 - 已修正原SQL中的两处细节问题:原表主键为
id而非merchant_id,列别名也调整为你预期输出的下划线命名格式。
内容的提问来源于stack exchange,提问作者Matty
相关产品推荐
相关产品推荐

