Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何根据其他列中的数据从列中选择数据并进行转置?_Sql_Oracle_Oracle12c - Fatal编程技术网

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

Sql 如何根据其他列中的数据从列中选择数据并进行转置?,sql,oracle,oracle12c,Sql,Oracle,Oracle12c,我有一个业务场景,我试图根据另一个列中的列值来选择列中的数据,然后将其转换为单个记录 我的数据: MEDIUM MEDIUM_DETAIL VALUE PHN HOME 7843898789 PHN WORK 8979909890 PHN MOBILE 9899876776 EML PRIMARY abc@abc.com EML

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

我的数据:

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='EML',首先检查MEDIUM\u DETAIL='PRIMARY',并使用其值。如果为NULL,则继续检查“ALTERNATE”并使用其值。如果两者都为null,则在EML列中打印null

在MEDIUM='PHN'中,首先检查MEDIUM\u DETAIL='HOME'。如果有值,请使用它。如果为空,则继续检查“工作”和“移动”。如果所有值都为NULL,则打印NULL

因此,根据上述示例,我的输出应该如下所示:

EML              PHN
abc@abc.com      7843898789
我尝试使用max(decode)…进行转置,甚至旋转,但这些技术需要某种聚合,不能给出所需的结果


有什么关于如何进行的建议吗

这只是一个透视查询:

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;
另一种方法是:

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;

这太棒了@事实上,如果另一个答案有效,可能会比我写的更好。@TimBiegeleisen这个解决方案效果很好。谢谢你的及时回复。下面由hakobot提供的解决方案显示重复的行,并且不转置数据,而是正确地获取优先级数据。