Строки Oracle Pivot в столбцы - PullRequest
0 голосов
/ 17 мая 2019

У меня есть таблица, которая выглядит следующим образом:

PART_ID  | ATTR_GROUP | ATTR_VALUE1 | ATTR_VALUE2 | COLUMN_NAME
--------------------------------------------------
M2CV4    | GROUP-A    | MATERIAL   |   N/A        |  ATTR_X1
M2CV4    | GROUP-A    | GRADE      |    A         |  ATTR_X2
M2CV4    | GROUP-B    | DOC ID     |   1234       |  ATTR_X1
M2CV4    | GROUP-B    | DOC TYPE   |   XX         |  ATTR_X2

Я бы хотел повернуть таблицу так:

PART_ID | ATTR_GROUP | ATTR_X1 | ATTR_X1_VALUE | ATTR_X2    | ATTR_X2_VALUE
---------------------------------------------------------------------------
M2CV4   | GROUP-A    | MATERIAL|   N/A         | GRADE      |  A
M2CV4   | GROUP-B    | DOC ID  |   1234        | DOC TYPE   | XX

Идентификатор детали может иметь несколько документов, поэтомуесли у M2CV4 есть 3 документа, то результат будет

PART_ID | ATTR_GROUP | ATTR_X1 | ATTR_X1_VALUE | ATTR_X2| ATTR_X2_VALUE
---------------------------------------------------------------------------
M2CV4   | GROUP-A    | MATERIAL|   N/A         | GRADE      |  A
M2CV4   | GROUP-B    | DOC ID  |   1234        | DOC TYPE   | XX
M2CV4   | GROUP-B    | DOC ID  |   456         | DOC TYPE   | XX
M2CV4   | GROUP-B    | DOC ID  |   333         | DOC TYPE   | XX

База данных Oracle 12c - версия 12.2.2.Я привожу здесь пример для 2 столбцов, но у меня есть намного больше, которые будут заполнены на основе группы и column_name

Спасибо за вашу помощь.Цени это.

1 Ответ

0 голосов
/ 17 мая 2019

Если я правильно понимаю, вам нужны дубликаты в отдельных строках.Я рекомендую использовать условное агрегирование для поворота в любом случае.Если вы сделаете это, вы можете решить проблему, используя row_number():

select part_id, attr_group,
       max(case when column_name = 'ATTR_X1' then attr_value end) as attr_x1,
       max(case when column_name = 'ATTR_X2' then attr_value end) as attr_x2
from (select t.*,
             row_number() over (partition by part_id, attr_group, column_name order by column_name) as seqnum
      from t
     ) t
group by part_id, attr_group, seqnum;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...