将具有多列的单行转置为两列的多行
Transpose single row with multiple columns into multiple rows of two columns
我有一个 SELECT
查询,它工作得非常好,它 returns 一个包含多个命名列的行:
| registered | downloaded | subscribed | requested_invoice | paid |
|------------|------------|------------|-------------------|------|
| 9000 | 7000 | 5000 | 4000 | 3000 |
但我需要将此结果转换为新的 table,如下所示:
| type | value |
|-------------------|-------|
| registered | 9000 |
| downloaded | 7000 |
| subscribed | 5000 |
| requested_invoice | 4000 |
| paid | 3000 |
我在 PostgreSQL 上启用了附加模块 tablefunc
,但我无法让 crosstab()
函数为此工作。我能做什么?
您需要 reverse 操作 crosstab()
所做的操作。有人称之为“逆向”。 LATERAL
连接到 VALUES
表达式应该是最优雅的方式:
SELECT l.*
FROM tbl -- or replace the table with your subquery
CROSS JOIN LATERAL (
VALUES
('registered' , registered)
, ('downloaded' , downloaded)
, ('subscribed' , subscribed)
, ('requested_invoice', requested_invoice)
, ('paid' , paid)
) l(type, value)
WHERE id = 1; -- or whatever
您可能需要强制转换部分或所有列以获得通用数据类型。喜欢:
...
VALUES
('registered' , registered::text)
, ('downloaded' , downloaded::text)
, ...
相关:
对于 reverse 操作 - "pivot" 或 "cross-tabulation":
- PostgreSQL Crosstab Query
我有一个 SELECT
查询,它工作得非常好,它 returns 一个包含多个命名列的行:
| registered | downloaded | subscribed | requested_invoice | paid |
|------------|------------|------------|-------------------|------|
| 9000 | 7000 | 5000 | 4000 | 3000 |
但我需要将此结果转换为新的 table,如下所示:
| type | value |
|-------------------|-------|
| registered | 9000 |
| downloaded | 7000 |
| subscribed | 5000 |
| requested_invoice | 4000 |
| paid | 3000 |
我在 PostgreSQL 上启用了附加模块 tablefunc
,但我无法让 crosstab()
函数为此工作。我能做什么?
您需要 reverse 操作 crosstab()
所做的操作。有人称之为“逆向”。 LATERAL
连接到 VALUES
表达式应该是最优雅的方式:
SELECT l.*
FROM tbl -- or replace the table with your subquery
CROSS JOIN LATERAL (
VALUES
('registered' , registered)
, ('downloaded' , downloaded)
, ('subscribed' , subscribed)
, ('requested_invoice', requested_invoice)
, ('paid' , paid)
) l(type, value)
WHERE id = 1; -- or whatever
您可能需要强制转换部分或所有列以获得通用数据类型。喜欢:
...
VALUES
('registered' , registered::text)
, ('downloaded' , downloaded::text)
, ...
相关:
对于 reverse 操作 - "pivot" 或 "cross-tabulation":
- PostgreSQL Crosstab Query