จะเลือกข้อมูลจากคอลัมน์ตามข้อมูลในคอลัมน์อื่นและย้ายข้อมูลได้อย่างไร

ฉันมีสถานการณ์ทางธุรกิจที่ฉันพยายามเลือกข้อมูลในคอลัมน์ตามค่าของคอลัมน์ในอีกคอลัมน์หนึ่ง แล้วจึงแปลงเป็นระเบียนเดียวในภายหลัง

ข้อมูลของฉัน:

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' ต่อไปและใช้ค่าของมัน หากทั้งสองค่าเป็นโมฆะ ให้พิมพ์ NULL ในคอลัมน์ EML

ใน MEDIUM = 'PHN' ให้ตรวจสอบ MEDIUM_DETAIL = 'HOME' ก่อน หากมีค่าก็ใช้มัน หากเป็นโมฆะ ให้ไปตรวจสอบ 'งาน' และ 'มือถือ' พิมพ์ 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