Как выбрать данные из столбца на основе данных в других столбцах и перенести их?

У меня есть бизнес-сценарий, в котором я пытаюсь выбрать данные в столбце на основе значений столбца в другом, а затем перенести его как одну запись.

Мои данные:

MEDIUM     MEDIUM_DETAIL    VALUE
PHN        HOME             7843898789
PHN        WORK             8979909890
PHN        MOBILE           9899876776
EML        PRIMARY          [email protected]
EML        ALTERNATE        [email protected]

Требуется отображать PHN и EML в виде двух столбцов на основе значений MEDIUM_DETAIL.

Если MEDIUM = 'EML', сначала проверьте MEDIUM_DETAIL = 'PRIMARY' и используйте его значение. Если это NULL, перейдите к проверке «ALTERNATE» и используйте его значение. Если оба равны нулю, то в столбце EML напечатайте NULL.

В MEDIUM = 'PHN' сначала проверьте MEDIUM_DETAIL = 'HOME'. Если есть значение, используйте его. Если это NULL, перейдите к проверке «WORK» и «MOBILE». Выведите NULL, если все значения нулевые.

Итак, мой вывод в соответствии с приведенным выше примером должен выглядеть так:

EML              PHN
[email protected]      7843898789

Я пытался использовать max(decode)... для транспонирования и даже PIVOT, но эти методы требуют какой-то агрегации и не дают требуемого результата.

Любые предложения о том, как это сделать?


person Bhavesh Dodia    schedule 05.06.2018    source источник


Ответы (2)


Это просто сводной запрос:

SELECT
    COALESCE(MAX(CASE WHEN MEDIUM = 'EML' AND MEDIUM_DETAIL = 'PRIMARY'
                      THEN VALUE END),
             MAX(CASE WHEN MEDIUM = 'EML' AND MEDIUM_DETAIL = 'ALTERNATE'
                      THEN VALUE END)) AS EML,
    COALESCE(MAX(CASE WHEN MEDIUM = 'PHN' AND MEDIUM_DETAIL = 'HOME'
                      THEN VALUE END),
             MAX(CASE WHEN MEDIUM = 'PHN' AND MEDIUM_DETAIL = 'WORK'
                      THEN VALUE END),
             MAX(CASE WHEN MEDIUM = 'PHN' AND MEDIUM_DETAIL = 'MOBILE'
                      THEN VALUE END)) AS PHN
FROM yourTable;
person Tim Biegeleisen    schedule 05.06.2018
comment
это круто! - person ITWeiHan; 05.06.2018
comment
@ITWeiHan На самом деле, другой ответ, если он сработает, вероятно, превзойдет то, что я написал. - person Tim Biegeleisen; 05.06.2018
comment
@TimBiegeleisen Это решение сработало хорошо. Спасибо за ваш быстрый ответ. Приведенное ниже решение от hakobot отображает повторяющиеся строки и не переносит данные, но получает правильные данные с учетом приоритета. - person Bhavesh Dodia; 05.06.2018

Другой способ получить его:

select MEDIUM, MEDIUM_DETAIL, VALUE ,FIRST_VALUE(value) IGNORE NULLS OVER(partition by MEDIUM order by (case when medium_detail = 'PRIMARY' then 1
                                                                    when medium_detail = 'HOME' then 1 
                                                                    when medium_detail = 'WORK' then 2
                                                                    when medium_detail = 'MOBILE' THEN 3
                                                                    else 4 end) asc) from ttt;
person hakobot    schedule 05.06.2018