我有一个SELECT查询工作得非常好,它返回一行多个命名列:

| registered | downloaded | subscribed | requested_invoice | paid |
|------------|------------|------------|-------------------|------|
| 9000       | 7000       | 5000       | 4000              | 3000 |

但是我需要将这个结果转换成一个新的表,如下所示:
| type              | value |
|-------------------|-------|
| registered        | 9000  |
| downloaded        | 7000  |
| subscribed        | 5000  |
| requested_invoice | 4000  |
| paid              | 3000  |

我在PostgreSQL上启用了附加模块tablefunc,但我无法让crosstab()函数为此工作。我能做什么?

最佳答案

你需要反向操作crosstab()的功能。有人称之为“反支点”或“反支点”。ALATERAL加入AVALUES表达式应该是最优雅的方式:

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)
, ...

相关:
Postgres: convert single row to multiple rows (unpivot)
对于反向操作-“枢轴”或“交叉制表”:
PostgreSQL Crosstab Query

关于sql - 将多列的单行转换为两列的多行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56877924/

10-15 17:13