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

PostgreSQL中无需多表连接实现表格行转列:contract_kind行转百分位列

PostgreSQL 表透视:无需多表连接实现行转列

当然可以,完全不需要创建多个带WHERE子句的表再连接,以下两种方法都能直接实现需求:

方法一:条件聚合(无需额外扩展)

这是最通用的方式,利用CASE WHEN结合聚合函数将行数据转为列:

SELECT
  contract_kind,
  MAX(CASE WHEN percentile = 'p50' THEN value END) AS p50,
  MAX(CASE WHEN percentile = 'p75' THEN value END) AS p75,
  MAX(CASE WHEN percentile = 'p90' THEN value END) AS p90,
  MAX(CASE WHEN percentile = 'p95' THEN value END) AS p95
FROM
  your_table_name  -- 替换为你的实际表名
GROUP BY
  contract_kind;

原理:通过CASE WHEN筛选出每个百分位对应的数值,再用MAX(或MIN,只要每个contract_kind+percentile组合唯一即可)聚合,将同一合同类型的不同百分位值合并到同一行的不同列。

方法二:使用crosstab函数(适合复杂透视场景)

如果需要处理更多类别或更灵活的透视,可以使用PostgreSQL的crosstab函数,需要先启用tablefunc扩展:

-- 仅需执行一次,启用扩展
CREATE EXTENSION IF NOT EXISTS tablefunc;

-- 执行透视查询
SELECT *
FROM crosstab(
  -- 源数据查询:按合同类型和百分位排序
  'SELECT contract_kind, percentile, value FROM your_table_name ORDER BY 1, 2',
  -- 指定要转为列的百分位值
  'SELECT DISTINCT percentile FROM your_table_name ORDER BY 1'
) AS ct_result(
  contract_kind text,
  p50 numeric,
  p75 numeric,
  p90 numeric,
  p95 numeric
);

原理:crosstab函数会自动将源数据中的行类别(percentile)转为列,直接输出透视后的结果,全程无需创建中间表。

内容的提问来源于stack exchange,提问作者Adithya Jayaram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:09:17