SQL如何将聚合行透视转为列 获取单行多列聚合计算结果
问题根因
你的查询返回两行、同行两列值重复的原因很明确:
GROUP BY name会按name的不同值拆分结果集,'x'和'y'会各自生成独立的结果行- 两个计算列都没有加name匹配条件,每行计算的都是当前分组的price总和/quantity总和比值,所以同一行的x、y值完全相同
解决方案
用条件聚合替代按name分组即可实现单行输出两个指标的需求,正确SQL语句如下:
SELECT ROUND(SUM(CASE WHEN name = 'x' THEN price ELSE 0 END) / SUM(CASE WHEN name = 'x' THEN quantity ELSE 0 END), 2) AS x, ROUND(SUM(CASE WHEN name = 'y' THEN price ELSE 0 END) / SUM(CASE WHEN name = 'y' THEN quantity ELSE 0 END), 2) AS y FROM orders WHERE name IN ('x', 'y') AND year = 2022;
逻辑说明
- 计算x列时,仅累加name为'x'的符合筛选条件的记录的price和quantity,做除法后保留两位小数,返回结果3.33
- 计算y列时,仅累加name为'y'的符合筛选条件的记录的price和quantity,做除法后保留两位小数,返回结果2.20
- 去掉
GROUP BY name后,查询最终只返回一行聚合结果,和你预期的输出完全匹配。
内容的提问来源于stack exchange,提问作者Ahtisham
相关产品推荐
相关产品推荐

