Как выбрать данные из столбца на основе данных в других столбцах и транспонировать их? - PullRequest
0 голосов
/ 05 июня 2018

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

Мои данные:

MEDIUM     MEDIUM_DETAIL    VALUE
PHN        HOME             7843898789
PHN        WORK             8979909890
PHN        MOBILE           9899876776
EML        PRIMARY          abc@abc.com
EML        ALTERNATE        alt@abc.com

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

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

В MEDIUM = 'PHN' сначала проверьте MEDIUM_DETAIL = 'HOME'.Если есть значение, используйте его.Если его значение NULL, перейдите к проверке «РАБОТА» и «МОБИЛЬНЫЙ».Выведите NULL, если все значения равны NULL.

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

EML              PHN
abc@abc.com      7843898789

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

Есть предложения, как это сделать?

Ответы [ 2 ]

0 голосов
/ 05 июня 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;
0 голосов
/ 05 июня 2018

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

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;
...