Объедините несколько столбцов в один столбец в Postgres - PullRequest
0 голосов
/ 05 февраля 2020

Попытка написать запрос, который может создать существующую таблицу Postgres, которая выглядит как первый набор ниже, чтобы получить результат второго набора здесь:

ID | Month1  | Month2
A  |    2    |   3   --(qty)
B  |    4    |   5   --(qty)

Результат

ID  | Month  | QTY
A   | Month1 | 2
A   | Month1 | 3
B   | Month1 | 4
B   | Month1 | 5 

Лучшая идея - использовать несколько союзов, но это будет очень долго. Есть ли более эффективный способ обойти это?

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

В Postgres вы можете отменить поворот с боковым соединением:

select t.id, m.month, m.qty
from mytable t
cross join lateral (values (t.Month1, 'Month1'), (t.Month2, 'Month2')) as m(qty, month)
order by t.id, m.month

Демонстрация на DB Fiddle :

id | month  | qty
:- | :----- | --:
A  | Month1 |   2
A  | Month2 |   3
B  | Month1 |   4
B  | Month2 |   5
0 голосов
/ 05 февраля 2020

Еще один потенциальный способ сделать это, используя generate_series:

select
  f.id,
  'Month' || i as month,
  case gs.i
    when 1 then f.month1
    when 2 then f.month2
  end as month
from
  foo f
  cross join generate_series (1, 2) gs (i)
...