Bagaimana cara memilih data dari kolom berdasarkan data di kolom lain dan mengubah urutannya?

Saya memiliki skenario bisnis di mana saya mencoba memilih data di kolom berdasarkan nilai kolom di kolom lain dan kemudian mengubahnya menjadi satu catatan.

Data saya:

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

Persyaratannya adalah menampilkan PHN & EML sebagai dua kolom berdasarkan nilai MEDIUM_DETAIL.

Jika MEDIUM = 'EML', centang dulu MEDIUM_DETAIL = 'PRIMARY' dan gunakan nilainya. Jika NULL, lanjutkan dengan mencentang 'ALTERNATE' dan gunakan nilainya. Jika keduanya null, maka cetak NULL di kolom EML.

Pada MEDIUM = 'PHN', centang dulu MEDIUM_DETAIL = 'HOME'. Jika ada nilainya, gunakanlah. Jika NULL, lanjutkan dengan mencentang 'WORK' dan 'MOBILE'. Cetak NULL jika semua nilai nol.

Jadi keluaran saya sesuai contoh di atas akan terlihat seperti:

EML              PHN
[email protected]      7843898789

Saya mencoba menggunakan max(decode)...untuk mengubah urutan dan bahkan PIVOT tetapi teknik ini memerlukan semacam agregasi dan tidak memberikan hasil yang diperlukan.

Adakah saran tentang cara melakukan hal ini?


person Bhavesh Dodia    schedule 05.06.2018    source sumber


Jawaban (2)


Ini hanyalah kueri pivot:

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
ini luar biasa! - person ITWeiHan; 05.06.2018
comment
@ITWeiHan Sebenarnya jawaban yang lain, jika berhasil, mungkin akan mengungguli apa yang saya tulis. - person Tim Biegeleisen; 05.06.2018
comment
@TimBiegeleisen Solusi ini bekerja dengan baik. Terima kasih atas tanggapan yang cepat. Solusi di bawah ini oleh hakobot menampilkan baris duplikat dan tidak mengubah urutan data tetapi mendapatkan data berdasarkan prioritas dengan benar. - person Bhavesh Dodia; 05.06.2018

Cara lain untuk mendapatkannya:

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