#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<> скрипка здесь