преобразование строк в столбцы с помощью oracle sql

#sql #oracle #pivot #transpose

#sql #Oracle #сводная #транспонировать

Вопрос:

Я пытаюсь преобразовать строки в столбцы, используя следующий пример:

LVL COL_VALUE TABLE_SRC
16 INT: ADDRESS_LINE_2:NULL INT
16 БАЗА: АДРЕС_LINE_2:X База
17 INT: ADDRESS_LINE_3:NULL INT
17 БАЗА: АДРЕС_LINE_3:X База

Вывод должен быть:

INT База
INT: ADDRESS_LINE_2:NULL БАЗА: АДРЕС_LINE_2:X
INT: ADDRESS_LINE_3:NULL БАЗА: АДРЕС_LINE_3:X

Значение COL_VALUE с тем же LVL должно быть в 1 строке

Я пытался использовать PIVOT, но он возвращает только 1 строку из-за агрегатной функции

 SELECT *
    FROM
        (
        SELECT 
                 BATCH_ID
                ,CONTACT_ID
                ,COL_VALUE
                ,TABLE_SRC
        FROM
            MISMATCH
        )
PIVOT
    (
        max(COL_VALUE) FOR TABLE_SRC IN ('1BASE' BASE, '1INT' INT)
    )
 

Комментарии:

1. Пожалуйста, опубликуйте свои примеры данных и ожидаемый результат только в виде текста.

Ответ №1:

Вы можете включить LVL во внутренний подзапрос:

 SELECT *
FROM   (
  SELECT  BATCH_ID
         ,CONTACT_ID
         ,COL_VALUE
         ,TABLE_SRC
         ,LVL
  FROM   MISMATCH
) PIVOT (
  max(COL_VALUE)
  FOR TABLE_SRC IN ('1BASE' BASE, '1INT' INT)
)
 

Если вы не хотите, чтобы это было в выходных данных, перейдите из SELECT * в список столбцов.

Что для ваших выборочных данных:

 CREATE TABLE mismatch (batch_id, contact_id, LVL, COL_VALUE, TABLE_SRC) AS
SELECT 1, 1, 16, 'INT: ADDRESS_LINE_2:NULL', '1INT'  FROM DUAL UNION ALL
SELECT 1, 1, 16, 'BASE: ADDRESS_LINE_2:X',   '1BASE' FROM DUAL UNION ALL
SELECT 1, 1, 17, 'INT: ADDRESS_LINE_3:NULL', '1INT'  FROM DUAL UNION ALL
SELECT 1, 1, 17, 'BASE: ADDRESS_LINE_3:X',   '1BASE' FROM DUAL;
 

Выводит:

BATCH_ID CONTACT_ID LVL База INT
1 1 16 БАЗА: АДРЕС_LINE_2:X INT: ADDRESS_LINE_2:NULL
1 1 17 БАЗА: АДРЕС_LINE_3:X INT: ADDRESS_LINE_3:NULL

db<> скрипка здесь