You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:15:03