在 ORACLE SQL 中将一组列转换为行

Posted

技术标签:

【中文标题】在 ORACLE SQL 中将一组列转换为行【英文标题】:Convert a set of columns into rows in ORACLE SQL 【发布时间】:2020-09-08 17:33:44 【问题描述】:

我有一个查询,它返回一个看起来有点像下面的表。

在图片中,我希望输入表看起来像输出表 --

基本上,我希望列中的所有数据都转置为行。但我不想将行转换为列。

我已经看到了转置行和列的解决方案,但想检查是否有任何人都知道的更简单的方法。任何帮助表示赞赏!

TIA

【问题讨论】:

您的预期结果中的hour 是什么? @Sujitmohanty30,输入表中的列 [0][1][2][3][4] 将被转换为行。 你检查解决方案了吗?成功了吗? 是的,它奏效了。我不得不做一些修改,但我明白了。谢谢! 【参考方案1】:

就像您已经知道将rows 转换为columns 一样需要PIVOT,类似于将columns 转换为rows 我们需要UNPIVOT

由于没有指定列名的特定表,我使用WITH 子句创建一个临时表来演示。 Here 是了解更多UNPIVOT 中使用的子句的链接,供您参考。

with table1
as
(
select 'Inbound' department, 50 hour0, 44 hour1, 29 hour2, 47 hour3, 17 hour4 from dual
union all
select 'Outbound', 6, 4, 10, 24, 39 from dual
union all
select 'Returns', 3, 1, 39, 43, 35 from dual
)
select *
  from table1 t1
unpivot (value for hour in (hour0 as '0',hour1 as '1',hour2 as '2',hour3 as '3',hour4 as '4'))

【讨论】:

【参考方案2】:

在 Oracle 中,我建议使用横向连接来取消透视表。假设这些列被称为hour0hour1hour2、...,这将表述为:

select t.department, x.*
from mytable t
cross apply (
    select 0 as hour, t.hour0 as value from dual
    union all select 1, t.hour1 from dual
    union all select 2, t.hour2 from dual
    union all ...
) x

【讨论】:

以上是关于在 ORACLE SQL 中将一组列转换为行的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle 11g 中将列转换为行

如何在sql server中将列转换为行

在SQL中将列转换为行

如何在 Sql Server 2008 R2 中将列转换为行?

在Oracle中将连字符分隔的字符串拆分为行

算法或 SQL:查找一组列的条件,确保结果集在特定列中的值始终 > 0