oracle11g - Oracle 11g 中将列转换为行

标签 oracle11g unpivot

我有一个这样的表:

+----+----------+----------+----------+-----------+----------+----------+
| ID | AR_SCORE | ER_SCORE | FS_SCORE | CPF_SCORE | IF_SCORE | IS_SCORE |
+----+----------+----------+----------+-----------+----------+----------+
|  1 |       25 |       35 |       45 |        55 |       65 |       75 |
|  2 |       95 |       85 |       75 |        65 |       55 |       45 |
+----+----------+----------+----------+-----------+----------+----------+

我需要提取这个:

+----+----------+-------+
| ID |  SCORE   | VALUE |
+----+----------+-------+
|  1 | AR_SCORE |    25 |
|  1 | ER_SCORE |    35 |
|  2 | AR_SCORE |    95 |
+----+----------+-------+

我阅读了很多有关如何在 Oracle 中使用数据透视的问题,但我无法使其工作。

最佳答案

从列到行的转换实际上是一个UNPIVOT。由于您使用的是 Oracle 11g,因此有几种方法可以获得结果。

第一种方法是使用SELECT yourcolumn FROM...UNION ALL的组合:

select ID, 'AR_SCORE' as Score, AR_SCORE as value
from yourtable
union all
select ID, 'ER_SCORE' as Score, ER_SCORE as value
from yourtable
union all
select ID, 'FS_SCORE' as Score, FS_SCORE as value
from yourtable
union all
select ID, 'IF_SCORE' as Score, IF_SCORE as value
from yourtable
union all
select ID, 'IS_SCORE' as Score, IS_SCORE as value
from yourtable
order by id

参见Demo 。在 Oracle 11g 之前,您需要使用 UNION ALL 来逆透视数据,但从该版本开始 UNPIVOT功能已实现。这将以更少的代码行获得相同的结果:

select ID, Score, value
from yourtable
unpivot
(
  value
  for Score in (AR_SCORE, ER_SCORE, FS_SCORE, IF_SCORE, IS_SCORE)
) un
order by id

参见Demo 。两者都会给出结果:

| ID |    SCORE | VALUE |
|----|----------|-------|
|  1 | AR_SCORE |    25 |
|  1 | FS_SCORE |    45 |
|  1 | IS_SCORE |    75 |
|  1 | IF_SCORE |    65 |
|  1 | ER_SCORE |    35 |
|  2 | FS_SCORE |    75 |
|  2 | IS_SCORE |    45 |
|  2 | ER_SCORE |    85 |
|  2 | IF_SCORE |    55 |
|  2 | AR_SCORE |    95 |

关于oracle11g - Oracle 11g 中将列转换为行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28046456/

相关文章:

sql - 我在 Oracle 中提交的频率

oracle - 从文件服务器中的 oracle 转储文件中提取特定模式

sql - T-sql 枢轴函数

sql - 使用 SQL 获取表的 "transpose"

sql - 单列SUM,不是单组群函数

java - Commons DBUtils Oracle 11.2.0.4 与 Java 1.7 绑定(bind)参数 SQLException ORA-00942

oracle11g - 在编排内手动构建消息

excel - 用户定义的连接

sql - 将一行转换为列数较少的多行

tsql - T-SQL VIEW - CTE + UNPIVOT 对比 UNION 对比其他技术