如何根据其他列中的数据从列中选择数据并进行转置?

时间:2018-06-05 07:28:02

标签: sql oracle oracle12c

我有一个业务场景,我试图根据另一个列中的列值选择列中的数据,然后将其转换为单个记录。

我的数据:

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但是这些技术需要某种聚合并且不能提供所需的结果。

有关如何解决这个问题的任何建议?

2 个答案:

答案 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;