Как выбрать несколько существующих имен столбцов и сгруппировать их в 1 столбец? - PullRequest
0 голосов
/ 17 октября 2019

Я использую posgresql. Как я могу сгруппировать имя столбца в один столбец и его значение в другом столбце из существующей таблицы? Затем использовать его для создания временной таблицы?

Существующая таблица:

+---------+----------+---------+----------+
|  col_a  |   col_b  |  col_c  |   col_d  |
+---------+----------+---------+----------+
|       1 |        2 |       3 |        4 |
+---------+----------+---------+----------+

Временная таблица:

+----------+----------+
|categories|   value  |
+----------+----------+
|   col_a  |        1 |  
|   col_b  |        2 |
|   col_c  |        3 | 
|   col_d  |        4 | 
+----------+----------+

Ниже приведен оператор sql для создания временной таблицы. .

CREATE TEMPORARY table myTable_temp
(
    categories Varchar (50),
    value float8
);

Но я все еще пытаюсь сгруппировать имена определенных столбцов в один столбец и перенести его значение в другой столбец, но все же связать его вместе.

Ответы [ 2 ]

2 голосов
/ 17 октября 2019

Этот процесс также известен как UNPIVOT и может быть выполнен следующим образом в Postgres:

select up.*
from the_table
  cross join lateral (
    values 
      ('col_a', col_a),
      ('col_b', col_b),
      ('col_c', col_c),
      ('col_d', col_d)
  ) as up(category, value);

Обратите внимание, что это работает, только если все столбцы имеют одинаковый тип данных.

Если выне возражайте против потери типа данных (или если столбцы имеют разные типы, и вам все равно нужно привести их к text), вы можете сделать это динамическим, используя функции JSON:

select up.*
from the_table tt
  cross join lateral jsonb_each_text(to_jsonb(tt)) as up;

Если вызная, что все значения могут быть приведены к одному и тому же типу, вы можете использовать:

select up.category, 
       up.value::float
from the_table tt
  cross join lateral jsonb_each_text(to_jsonb(tt)) as up(category, value);

Онлайн пример: https://rextester.com/SHOY36906


Если вам нужно сопоставить столбец «значение» сИсходный первичный ключ таблицы, вы можете сделать что-то вроде этого (при условии, что первичный ключ имеет имя id)

select tt.id, up.*
from the_table tt
  cross join lateral jsonb_each_text(to_jsonb(tt) - 'id') as up(category, value)
order by tt.id;

Онлайн пример: https://rextester.com/MSXD50860

1 голос
/ 17 октября 2019

Вы просто хотите союз

   Select "col_a" , col_a as "value" from 
   table 
   union
   Select  "col_b" , col_b as "value"  from 
   table
   union
   Select  "col_c" , col_c as "value"  from 
    table 
    union
   Select  "col_d" , col_d as "value"   from 
    table 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...