技术文摘
Oracle 实现列转行的 SQL 语句是怎样的
2025-01-15 01:01:14 小编
Oracle 实现列转行的 SQL 语句是怎样的
在数据库处理中,列转行是一种常见需求,Oracle 数据库提供了多种方法来实现这一操作,掌握这些方法能有效提升数据处理效率。
使用 DECODE 函数是实现列转行的基础方式之一。例如,有一张存储学生课程成绩的表 student_scores,包含 student_id(学生 ID)、course_name(课程名称)和 score(成绩)字段。若要将课程成绩按学生 ID 进行列转行展示,把不同课程成绩转换为列,可通过 DECODE 函数实现。代码大致如下:
SELECT student_id,
MAX(DECODE(course_name, '数学', score)) AS 数学成绩,
MAX(DECODE(course_name, '英语', score)) AS 英语成绩
FROM student_scores
GROUP BY student_id;
这段代码中,DECODE 函数对 course_name 进行判断,若为指定课程,则返回对应的 score,MAX 函数用于处理可能存在的多条记录情况,GROUP BY 按 student_id 分组。
PIVOT 操作符是 Oracle 11g 引入的强大功能,它为列转行提供了更简洁直观的方式。还是以上述成绩表为例,使用 PIVOT 操作符的代码如下:
SELECT *
FROM (
SELECT student_id, course_name, score
FROM student_scores
)
PIVOT (
MAX(score)
FOR course_name IN ('数学' AS 数学成绩, '英语' AS 英语成绩)
);
在这段代码里,内层查询获取基础数据,PIVOT 操作符将 course_name 作为转置的依据,MAX(score) 确定要展示的值,IN 子句指定了要转换的列及新列名。
还有 CASE WHEN 语句也能实现列转行。与 DECODE 函数类似,CASE WHEN 逻辑更为灵活。示例代码如下:
SELECT student_id,
MAX(CASE WHEN course_name = '数学' THEN score END) AS 数学成绩,
MAX(CASE WHEN course_name = '英语' THEN score END) AS 英语成绩
FROM student_scores
GROUP BY student_id;
通过 CASE WHEN 条件判断,根据课程名称返回相应成绩。
不同方法在不同场景各有优势。DECODE 函数语法简单,适用于简单条件判断;PIVOT 操作符简洁直观,尤其在数据量较大且规则明确时表现出色;CASE WHEN 语句逻辑灵活,可处理复杂条件。熟练掌握这些 Oracle 实现列转行的 SQL 语句,能在数据处理工作中更加得心应手。
- 六种提升 Go 应用性能的方法
- Angular 推出新文档与新 Logo
- React 框架的完美之选:Remix、Next.js 与 Gatsby 三巨头之争
- 四个出色的开源后端服务系统 专注开发应用逻辑
- 基于 Topic 的消息发布及消费模式
- 多核处理器力量的解锁:Java 8 Stream 中数据并行化应用探索
- 数据结构与集合的密切关联,你知几何?
- Python 助力从零构建多分类 SVM
- Kafka 吞吐量高的原因何在?
- Java AOP 助力面向切面编程的实现
- Java 线程状态究竟是五种还是六种
- Jenkins 原理之成员权限管理
- Python 集合模块:数据容器处理数据集合的应用
- 8 个优化编程体验的 VS Code 插件
- Spring Boot 购物车逻辑实现与示例代码