PostgreSQL行列转换:无需GROUP BY/CASE的替代方案
无需GROUP BY和CASE的实现方式
在PostgreSQL中,你可以通过UNNEST结合数组拆分列,再搭配crosstab函数(需先安装tablefunc扩展)来实现需求,全程不需要用到GROUP BY和CASE语法:
1. 先安装tablefunc扩展(若未安装)
CREATE EXTENSION IF NOT EXISTS tablefunc;
2. 转换查询语句
假设你的metric_code仅包含metric_1和metric_2两种取值,执行以下查询即可得到目标格式:
SELECT * FROM crosstab( -- 子查询:将原表的多人群列拆分为行 $$ SELECT region, predicate_code, metric_code, value FROM tbl, UNNEST( ARRAY['male', 'female', 'pensioners', 'teenagers'], ARRAY[male, female, pensioners, teenagers] ) AS t(predicate_code, value) $$, -- 指定要转换为列的metric_code值 $$SELECT unnest(ARRAY['metric_1', 'metric_2'])$$ ) AS ct(region text, predicate_code text, metric_1 numeric, metric_2 numeric);
逻辑说明
UNNEST拆列成行:把原表中male、female等数值列,与对应的人群名称数组配对,拆分成每行对应一个人群类型(predicate_code)和对应数值的结构,同时保留原有的region和metric_code。crosstab透视转列:将拆分后的行数据,按region和predicate_code聚合,把metric_code的不同取值转换为列(即metric_1、metric_2),直接输出你期望的格式。
内容的提问来源于stack exchange,提问作者Maximusrs
相关产品推荐
相关产品推荐

