postgres行列转换
时间: 2023-09-10 13:10:59 浏览: 54
PostgreSQL中可以使用crosstab函数将行转换为列。 该函数需要安装tablefunc扩展。以下是一个示例:
假设我们有以下表格:
```
CREATE TABLE sales (
id SERIAL PRIMARY KEY,
year INT NOT NULL,
quarter INT NOT NULL,
amount NUMERIC(10,2) NOT NULL
);
INSERT INTO sales (year, quarter, amount)
VALUES
(2019, 1, 1000),
(2019, 2, 1500),
(2019, 3, 2000),
(2019, 4, 2500),
(2020, 1, 3000),
(2020, 2, 3500),
(2020, 3, 4000),
(2020, 4, 4500);
```
我们想将它转换为以下格式:
```
year | Q1 | Q2 | Q3 | Q4
-----+------+------+------+-----
2019 | 1000 | 1500 | 2000 | 2500
2020 | 3000 | 3500 | 4000 | 4500
```
我们可以使用以下查询:
```
SELECT *
FROM crosstab(
'SELECT year, quarter, amount FROM sales ORDER BY 1,2',
'SELECT unnest(ARRAY[1,2,3,4])'
) AS ct(year INT, Q1 NUMERIC, Q2 NUMERIC, Q3 NUMERIC, Q4 NUMERIC);
```
该查询使用了两个SELECT语句,第一个SELECT返回原始数据,第二个SELECT返回列名。注意,列名的数量和顺序必须与转换后的表格一致。
输出结果如下:
```
year | q1 | q2 | q3 | q4
------+-------+-------+-------+-------
2019 | 1000.00 | 1500.00 | 2000.00 | 2500.00
2020 | 3000.00 | 3500.00 | 4000.00 | 4500.00
```