热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Oracle数据转换技巧:行转列与列转行

在日常的数据处理工作中,我们经常需要将数据从行格式转换为列格式,反之亦然。本文将介绍几种在Oracle数据库中实现行转列和列转行的有效方法,包括使用PIVOT和UNPIVOT函数,以及结合MAX函数与DECODE或CASEWHEN语句。

在数据管理和分析过程中,数据格式的转换是一项常见需求。本文将探讨如何在 Oracle 数据库中高效地进行行转列和列转行的操作。

### 1. 使用 PIVOT 函数进行行转列

PIVOT 函数是 Oracle 提供的一个强大的工具,用于将数据从行格式转换为列格式。下面是一个具体的例子:

假设我们有一个包含省份、城市和排名信息的表,原始数据如下所示:

通过使用 PIVOT 函数,我们可以轻松地将这些数据转换为以排名为列的形式:

with temp as (
select '四川省' nation, '成都市' city, '第一' ranking from dual union all
select '四川省' nation, '绵阳市' city, '第二' ranking from dual union all
select '四川省' nation, '德阳市' city, '第三' ranking from dual union all
select '四川省' nation, '宜宾市' city, '第四' ranking from dual union all
select '湖北省' nation, '武汉市' city, '第一' ranking from dual union all
select '湖北省' nation, '宜昌市' city, '第二' ranking from dual union all
select '湖北省' nation, '襄阳市' city, '第三' ranking from dual
)
select * from (
select nation, city, ranking from temp
) pivot (
max(city) for ranking in ('第一' as 第一, '第二' as 第二, '第三' as 第三, '第四' as 第四)
);

转换后的结果如下图所示:

### 2. 使用 MAX 和 DECODE 函数进行行转列

除了 PIVOT 函数,我们还可以结合 MAX 和 DECODE 函数来实现行转列的功能。这种方法适用于较旧版本的 Oracle 数据库或特定场景下:

with temp as (
select '四川省' nation, '成都市' city, '第一' ranking from dual union all
select '四川省' nation, '绵阳市' city, '第二' ranking from dual union all
select '四川省' nation, '德阳市' city, '第三' ranking from dual union all
select '四川省' nation, '宜宾市' city, '第四' ranking from dual union all
select '湖北省' nation, '武汉市' city, '第一' ranking from dual union all
select '湖北省' nation, '宜昌市' city, '第二' ranking from dual union all
select '湖北省' nation, '襄阳市' city, '第三' ranking from dual
)
select nation,
max(decode(ranking, '第一', city, '')) as 第一,
max(decode(ranking, '第二', city, '')) as 第二,
max(decode(ranking, '第三', city, '')) as 第三,
max(decode(ranking, '第四', city, '')) as 第四
from temp
group by nation;

### 3. 使用 MAX 和 CASE WHEN 函数进行行转列

CASE WHEN 语句提供了更灵活的条件判断方式,可以用来替代 DECODE 函数。例如,如果我们要根据年级和科目名称转换成绩数据,可以使用以下 SQL 语句:

select case when grade_id = '1' then '一年级'
when grade_id = '2' then '二年级'
when grade_id = '5' then '五年级'
else null end "年级",r> max(case when subject_name = '语文' then max_score else 0 end) "语文",
max(case when subject_name = '数学' then max_score else 0 end) "数学",
max(case when subject_name = '政治' then max_score else 0 end) "政治"
from dim_ia_test_ysf
group by case when grade_id = '1' then '一年级'
when grade_id = '2' then '二年级'
when grade_id = '5' then '五年级'
else null end;

### 4. 使用 UNPIVOT 函数进行列转行

UNPIVOT 函数与 PIVOT 相反,它将列数据转换为行数据。例如,如果我们有一个包含省份和多个城市排名的表,可以通过 UNPIVOT 将其转换为每个城市的单独行:

with temp as (
select '四川省' nation, '成都市' 第一, '绵阳市' 第二, '德阳市' 第三, '宜宾市' 第四 from dual union all
select '湖北省' nation, '武汉市' 第一, '宜昌市' 第二, '襄阳市' 第三, '' 第四 from dual
)
select nation, name, title from
temp
unpivot (name for title in (第一, 第二, 第三, 第四)) t;

通过上述方法,我们可以在 Oracle 数据库中灵活地进行数据格式的转换,以满足不同的业务需求。


推荐阅读
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文介绍如何通过创建替代插入触发器,使对视图的插入操作能够正确更新相关的基本表。涉及的表包括:飞机(Aircraft)、员工(Employee)和认证(Certification)。 ... [详细]
  • Ralph的Kubernetes进阶之旅:集群架构与对象解析
    本文深入探讨了Kubernetes集群的架构和核心对象,详细介绍了Pod、Service、Volume等基本组件,以及更高层次的抽象如Deployment、StatefulSet等,帮助读者全面理解Kubernetes的工作原理。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 本文介绍如何使用JPA Criteria API创建带有多个可选参数的动态查询方法。当某些参数为空时,这些参数不会影响最终查询结果。 ... [详细]
author-avatar
xjw4478688
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有