PostgreSQL GROUP BY查询行转列需求:状态统计转为列展示
解决方案:使用条件聚合实现行转列
要实现将每个日期的不同状态统计转为列展示,最简洁高效的方式是条件聚合——在聚合函数中结合CASE语句,针对每个状态单独统计数量,最终每个日期只会返回一行结果。
修改后的SQL语句
SELECT concat( EXTRACT(YEAR FROM "BEAUFTRAGUNG_DATUM"), '-', TO_CHAR(EXTRACT(MONTH FROM "BEAUFTRAGUNG_DATUM"), 'fm00') ) AS "DATUM", -- 统计OTHER状态数量,无数据则返回0 SUM(CASE WHEN "STATUS" IN ('....', '...') THEN 1 ELSE 0 END) AS "OTHER", -- 统计BESTELLT状态数量 SUM(CASE WHEN "STATUS" = 'BESTELLT' THEN 1 ELSE 0 END) AS "BESTELLT", -- 统计VOR_PRODUKTION状态数量 SUM(CASE WHEN "STATUS" = 'VOR_PRODUKTION' THEN 1 ELSE 0 END) AS "VOR_PRODUKTION" FROM PUBLIC."TXS" WHERE "FLAG_POS" = '1' GROUP BY "DATUM" ORDER BY "DATUM" ASC;
关键说明
- 条件聚合逻辑:每个状态列通过
SUM(CASE ... END)实现——当行数据匹配目标状态时返回1,否则返回0,最终求和得到该状态的总数量,天然支持无数据时返回0。 - 性能优势:相比JOIN多张子查询结果的方式,条件聚合只需扫描一次原表,执行效率更高,代码也更简洁易维护。
- 日期分组:保留了你原有的日期格式化逻辑,确保
DATUM字段的格式与需求一致。
如果偏好使用COUNT替代SUM,可以写成COALESCE(COUNT(CASE WHEN ... THEN 1 END), 0),但SUM的写法更直接,无需额外处理NULL值。
内容的提问来源于stack exchange,提问作者CodeoDE
相关产品推荐
相关产品推荐

