postgres unpivot替代
时间: 2023-09-18 22:16:23 浏览: 35
在PostgreSQL中,可以使用UNION ALL操作符来实现unpivot的功能,如下所示:
```
SELECT id, 'col1' AS column_name, col1 AS value
FROM my_table
UNION ALL
SELECT id, 'col2' AS column_name, col2 AS value
FROM my_table
UNION ALL
SELECT id, 'col3' AS column_name, col3 AS value
FROM my_table;
```
此查询将my_table表中的col1、col2和col3列转换为行,每行包含id、column_name和value列。这就是unpivot的效果。
相关问题
postgres pivot替代
在 PostgreSQL 中,可以使用 crosstab 函数来执行 pivot 操作。crosstab 函数需要安装 "tablefunc" 模块,可以使用以下命令安装:
```
CREATE EXTENSION tablefunc;
```
然后,可以使用以下语法执行 pivot 操作:
```
SELECT *
FROM crosstab(
'SELECT <row_column>, <category_column>, <value_column>
FROM <table_name>
ORDER BY <row_column>, <category_column>',
'SELECT DISTINCT <category_column>
FROM <table_name>
ORDER BY 1'
) AS ct (<row_column> <row_type>, <category_column_1> <category_type_1>, <category_column_2> <category_type_2>, ..., <category_column_n> <category_type_n>);
```
其中,<row_column> 表示要作为行的列名,<category_column> 表示要作为列的列名,<value_column> 表示要填充数据的列名。可以根据需要添加更多的 <category_column>。
例如,如果有以下表格:
```
id | name | category | value
---+------+----------+-------
1 | A | X | 10
2 | B | X | 20
3 | A | Y | 30
4 | B | Y | 40
```
可以使用以下查询执行 pivot 操作:
```
SELECT * FROM crosstab(
'SELECT name, category, value FROM table_name ORDER BY 1,2',
'SELECT DISTINCT category FROM table_name ORDER BY 1'
) AS ct (name varchar, X int, Y int);
```
得到以下结果:
```
name | X | Y
-----+----+----
A | 10 | 30
B | 20 | 40
```
postgres pivot替代实现
PostgreSQL中没有内置的PIVOT函数,但可以使用UNION ALL和CASE语句来实现类似的效果。
例如,假设有以下表格:
```
table1:
id | name | value
---+------+-------
1 | A | 10
2 | B | 20
3 | C | 30
table2:
id | name | value
---+------+-------
1 | A | 40
2 | B | 50
3 | C | 60
```
要将这两个表格中的数据进行PIVOT操作,可以使用以下SQL语句:
```
SELECT name,
MAX(CASE WHEN source = 'table1' THEN value END) AS table1_value,
MAX(CASE WHEN source = 'table2' THEN value END) AS table2_value
FROM (
SELECT id, name, value, 'table1' AS source FROM table1
UNION ALL
SELECT id, name, value, 'table2' AS source FROM table2
) AS combined
GROUP BY name;
```
这将生成以下结果:
```
name | table1_value | table2_value
-----+--------------+--------------
A | 10 | 40
B | 20 | 50
C | 30 | 60
```
这个查询使用UNION ALL将两个表格组合成一个子查询,然后使用CASE语句将每个表格的值放在不同的列中。最后,使用GROUP BY将相同名称的行合并在一起,并使用MAX函数来获取每个表格中的最大值。