在 PostgreSQL 中,如果你想将表中的某一列的数据变成列标题(通常被称为“列转行”或“交叉表”操作)
你可以使用 crosstab
函数,这个函数是 PostgreSQL 提供的 tablefunc 扩展中的一部分
安装 tablefunc 扩展
CREATE EXTENSION IF NOT EXISTS tablefunc;
安装成功,可以在扩展中查看
使用 crosstab 函数
SELECT *
FROM crosstab(
$$SELECT workplace, province, benefits FROM postgres.public.benefits
ORDER BY workplace, province$$
) AS ct (workplace varchar, "合肥" int, "上海" int, "北京" int, "西安" int);
在这里,crosstab 函数的第一个参数是一个 SQL 查询,返回的结果必须包含三列:行标题列(workplace)、列标题列(province)和数值列(benefits )。第二个参数是结果表的列定义,必须明确指定每个新列的名称和数据类型。
注意事项
- 列标题必须事先知道:在定义 crosstab 函数的输出列时,必须提前知道所有可能的列标题(即 province列的所有可能值)。
- 数据类型匹配:定义的列数据类型必须与原始表中的数据类型匹配。
- 数据量大的情况:如果有很多列(即 province的不同值很多),这个过程可能变得复杂,可以考虑动态生成列名和数据类型。