如何在PostgreSQL中实现表格转置,按指定列生成SLOT维度的结果表
PostgreSQL 实现方案
你的需求属于典型的行转列(透视表)转换场景,有两种常用实现方式:
方法1:CASE 条件聚合(无需额外扩展,兼容性最高)
无需安装任何扩展,直接写原生SQL即可实现,以按columnA重构为例:
SELECT ID, NAME, MAX(CASE WHEN SLOT = 'SLOT1' THEN columnA END) AS SLOT1, MAX(CASE WHEN SLOT = 'SLOT2' THEN columnA END) AS SLOT2, MAX(CASE WHEN SLOT = 'SLOT3' THEN columnA END) AS SLOT3 FROM 你的源表名称 GROUP BY ID, NAME ORDER BY ID;
需要切换其他字段重构时,仅需把CASE子句中THEN后的columnA替换为对应列名(columnB/columnC/columnD/columnE)即可。由于同一个ID+NAME+SLOT组合下仅存在一条记录,MAX聚合不会修改原始值,无对应SLOT的记录会自动返回NULL,完全匹配你的预期输出。
方法2:crosstab 透视函数(适合SLOT值动态变化场景)
如果后续SLOT值可能新增,可以使用PostgreSQL的tablefunc扩展提供的crosstab函数实现:
-- 首次使用需要先安装扩展,仅需执行一次 CREATE EXTENSION IF NOT EXISTS tablefunc;
以按columnA重构为例:
SELECT * FROM crosstab( 'SELECT ID, NAME, SLOT, columnA FROM 你的源表名称 ORDER BY 1,2', 'SELECT DISTINCT SLOT FROM 你的源表名称 ORDER BY 1' ) AS ct (ID INT, NAME TEXT, SLOT1 INT, SLOT2 INT, SLOT3 INT);
切换重构字段时替换第一个参数SQL中的columnA为对应列即可,注意末尾定义输出字段的类型需要和源表对应列的类型保持一致,比如重构columnC(布尔类型)时,SLOT1/SLOT2/SLOT3的类型要定义为BOOLEAN。
内容的提问来源于stack exchange,提问作者Ahmet Zeybek
相关产品推荐
相关产品推荐

