Транспонирование строк в столбцы в oracle - PullRequest
2 голосов
/ 22 марта 2020

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

У меня есть две таблицы, одна с людьми и с отношениями. Родители имеют по одной ссылке на каждого ребенка, поэтому два родителя будут двумя строками в таблице отношений.

Таблица персон:

id        name
1         John Doe
2         Jane Doe
3         Johnny Doe

Таблица отношений:

person_1_id    person_2_id
1              3
2              3

Итак, если я запусту следующее SQL:

SELECT child.id AS child_id, r.person_1_id AS parent_id
    FROM person child
    JOIN relation r ON r.person_2_id = child.id;

, я получу следующий вывод:

child_id    parent_id  
3           1  
3           2

Как бы я go о получении вывода как:

child_id   parent_1_id   parent_2_id
3          1             2

Я бегу Oracle 12 c.

Ответы [ 2 ]

2 голосов
/ 22 марта 2020

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

SELECT
    CHILD_ID,
    MAX(CASE WHEN RN = 1 THEN PARENT_ID END) AS PARENT_1_ID,
    MAX(CASE WHEN RN = 2 THEN PARENT_ID END) AS PARENT_2_ID
FROM
    ( SELECT
          CHILD.ID        AS CHILD_ID,
          R.PERSON_1_ID   AS PARENT_ID,
          ROW_NUMBER() OVER(PARTITION BY CHILD.ID ORDER BY R.PERSON_1_ID) AS RN
        FROM
          PERSON CHILD
          JOIN RELATION R ON R.PERSON_2_ID = CHILD.ID
    )
GROUP BY CHILD_ID;
1 голос
/ 22 марта 2020

Вы можете просто использовать агрегацию:

SELECT child.id AS child_id,
       MIN(r.person_1_id) AS parent_id_1,
       NULLIF(MAX(r.person_1_id), MIN(r.person_1_id) AS parent_id_2
FROM person child JOIN
     relation r
     ON r.person_2_id = child.id
GROUP BY child.id;

Подзапросы не нужны для этого.

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