如何转置查询结果行列?实现年度销售数据对比的列展示
解决方案:用条件聚合实现行转列
没问题,你可以用条件聚合的方式把行式结果转换成需要的列式对比——直接在SELECT语句里分别计算上年(PY)和本年(CY)的销售总和,同时固定KPI字段的内容。
修改后的查询语句
SELECT 'sales_volume' AS KPI, SUM(CASE WHEN sales_date BETWEEN '2019-03-16' AND '2019-03-18' THEN sales_volume ELSE 0 END) AS PY, SUM(CASE WHEN sales_date BETWEEN '2020-03-16' AND '2020-03-18' THEN sales_volume ELSE 0 END) AS CY FROM sales WHERE (sales_date BETWEEN '2019-03-16' AND '2019-03-18') OR (sales_date BETWEEN '2020-03-16' AND '2020-03-18');
核心逻辑说明
'sales_volume' AS KPI:直接固定这一列的内容为你需要的指标名称SUM(CASE ...):对每个时间区间的销量做条件求和,不在目标区间内的记录贡献0,最终得到对应年份的总销量- WHERE子句:过滤掉无关日期,提升查询效率(也可以省略,但保留会让计算更高效)
执行后得到的预期结果
| KPI | PY | CY |
|---|---|---|
| sales_volume | 1500 | 2570 |
补充:为什么原查询是行结构?
你原来的查询是按time字段分组(GROUP BY 1),所以每个时间区间会生成一行记录。而条件聚合是把多个分组的结果直接转换成列,这里不需要额外分组(除非你要按其他维度拆分,当前需求不需要)。
内容的提问来源于stack exchange,提问作者Michi
相关产品推荐
相关产品推荐

