我有一个业务场景,我试图根据另一个列中的列值选择列中的数据,然后将其转换为单个记录。
我的数据:
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,则在EML列中打印NULL。
在MEDIUM ='PHN'中,首先检查MEDIUM_DETAIL ='HOME'。如果有值,请使用它。如果为NULL,请继续检查'WORK'和'MOBILE'。如果所有值都为null,则打印NULL。
所以我的输出如上例所示:
EML PHN
abc@abc.com 7843898789
我尝试使用max(decode)...进行转置甚至是PIVOT但是这些技术需要某种聚合并且不能提供所需的结果。
有关如何解决这个问题的任何建议?
答案 0 :(得分: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;
答案 1 :(得分:0)
获得它的另一种方法:
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;