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提供的解决方案显示重复的行,并且不转置数据,而是正确地获取优先级数据。