如何在PostgreSQL中转置部分数据字段?max(case)尝试失败
解决方案
可以通过分组聚合+关联查询实现需求:先提取每个id对应的区域信息(state、district、block),再将其与指标记录关联,最终得到目标格式。
对应的SQL语句如下:
SELECT t.id, agg.state, agg.district, agg.block, t.indicator, t.value FROM mytable t JOIN ( SELECT id, MAX(CASE WHEN indicator = 'state' THEN value END) AS state, MAX(CASE WHEN indicator = 'district' THEN value END) AS district, MAX(CASE WHEN indicator = 'block' THEN value END) AS block FROM mytable GROUP BY id ) agg ON t.id = agg.id WHERE t.indicator LIKE 'indicator%';
逻辑说明:
- 子查询
agg:按id分组,用MAX(CASE)将每个id对应的state、district、block值从行转换为列,得到每个id的区域信息单行记录。 - 外层查询:关联原表
mytable和子查询结果,通过WHERE筛选出所有指标类(indicator以indicator开头)的记录,将区域信息与每条指标记录拼接,输出目标结构。
执行该语句后,即可得到你期望的输出格式。
内容的提问来源于stack exchange,提问作者sahil
相关产品推荐
相关产品推荐

