Oracle SQL - новая таблица с транспонированием столбца в строку

В настоящее время у меня есть таблица Oracle под названием «test» и данные ниже (3 столбца):

KEY GROUP VALUE 
1   col_1 789
1   col_2 12345
1   col_3 525
1   col_4 ABCD
2   col_1 abc
2   col_2 ds
2   col_3 fg
2   col_4 1234
2   col_5 777

Я хочу создать новую таблицу на основе таблицы test, но хочу, чтобы столбец переместился в строку, ниже я ожидаю:

KEY COL1  COL2   COL3  COL4   COL5
1   789   12345  525   ABCD  (null)
2   abc   ds     fg    1234   777

Не каждый «Ключ» имеет все значение «ГРУППА» в «тестовой» таблице. Например, у ключа 2 5 групп, а у ключа 1 только 4, мне нужна новая структура таблицы, чтобы все группы были доступны для любого заданного ключа. Если ключ не имеет значения группы, а другой ключ имеет, оставьте ячейку равной нулю.

Кто-нибудь может написать мне образец запроса? Спасибо!

Возможный дубликат Как преобразовать строки в столбцы в Oracle?

Sam M 31.10.2018 23:02

Возможный дубликат Сводный запрос Oracle SQL

Clockwork-Muse 31.10.2018 23:13
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
290
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать использовать ROW_NUMBER для создания номера строки, а затем выполнить функцию агрегирования условий, чтобы сделать это.

CREATE TABLE T(
   "KEY" INT,
   "GROUP" VARCHAR(50),
   "VALUE" VARCHAR(50)
);


INSERT INTO T VALUES (1,'col_1','789');
INSERT INTO T VALUES (1,'col_2','12345');
INSERT INTO T VALUES (1,'col_3','525');
INSERT INTO T VALUES (1,'col_4','ABCD');
INSERT INTO T VALUES (2,'col_1','abc');
INSERT INTO T VALUES (2,'col_2','ds');
INSERT INTO T VALUES (2,'col_3','fg');
INSERT INTO T VALUES (2,'col_4','1234');
INSERT INTO T VALUES (2,'col_5','777');

Запрос 1:

SELECT "KEY",
       MAX(CASE WHEN rn = 1 THEN "VALUE" END) COL1,
       MAX(CASE WHEN rn = 2 THEN "VALUE" END) COL2,
       MAX(CASE WHEN rn = 3 THEN "VALUE" END) COL3,
       MAX(CASE WHEN rn = 4 THEN "VALUE" END) COL4,
       MAX(CASE WHEN rn = 5 THEN "VALUE" END) COL5
 FROM (
    SELECT t1.*,ROW_NUMBER() OVER(PARTITION BY "KEY" ORDER BY "GROUP") rn
    FROM T t1
) t1
GROUP BY "KEY"

Полученные результаты:

| KEY | COL1 |  COL2 | COL3 | COL4 |   COL5 |
|-----|------|-------|------|------|--------|
|   1 |  789 | 12345 |  525 | ABCD | (null) |
|   2 |  abc |    ds |   fg | 1234 |    777 |

Другие вопросы по теме