首先要启用tablefunc 扩展。
用管理员账户执行下面的指令。
CREATE EXTENSION tablefunc;
在 PostgreSQL 中,你可以使用 crosstab 函数将列转换为行。crosstab 函数是在 tablefunc 扩展中提供的,因此在使用之前,你需要确保已经安装并启用了该扩展。
下面是一个示例,假设你有一个名为 sales 的表,其中包含了销售数据:
CREATE TABLE sales (
product_id INT,
month INT,
amount NUMERIC
);
INSERT INTO sales (product_id, month, amount)
VALUES
(1, 1, 100),
(1, 2, 150),
(1, 3, 200),
(2, 1, 50),
(2, 2, 75),
(2, 3, 100);
现在,你想要将这些数据按照产品 ID 进行列转行,使得每个产品的销售额在不同的月份中成为一行。你可以使用以下查询来实现:
SELECT *
FROM crosstab(
'SELECT product_id, month, amount
FROM sales
ORDER BY 1, 2',
'VALUES (1), (2), (3)'
) AS sales_pivot (product_id INT, month_1 NUMERIC, month_2 NUMERIC, month_3 NUMERIC);
这个查询中,我们首先指定了原始查询,它返回了 product_id、month 和 amount 列。然后,我们指定了一个包含所有可能 product_id 值的值列表,这里是 (1), (2), (3)。最后,我们使用 crosstab 函数将原始查询的结果进行转换,并指定了转换后的列名。
运行上述查询,你将会得到以下结果:
product_id | month_1 | month_2 | month_3
------------+---------+---------+---------
1 | 100 | 150 | 200
2 | 50 | 75 | 100
这样,你就将原始的列转换为了行,每个产品的销售额在不同的月份中成为了一行。
更多案例请参考:
https://blog.csdn.net/qq_31156277/article/details/90598311