Транспонировать одну строку с несколькими столбцами в несколько строк двух столбцов - PullRequest
2 голосов
/ 04 июля 2019

У меня есть запрос 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  |

У меня включен дополнительный модуль tablefunc в PostgreSQL, но я не могу заставить функцию crosstab() работать для этого.Что я могу сделать?

1 Ответ

2 голосов
/ 04 июля 2019

Вам нужна операция реверс того, что делает 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)
, ...

Связанный:

Для операции реверс - "сводная таблица" или "перекрестная табуляция":

...