Oracle中的[行转列]与[列转行]

目录

一、原始数据

二、行转列的多种实现方式

1.CASE WHEN

2.DECODE

3.PIVOT(Oracle独有)

4.使用LEAD开窗函数

三、列转行的多种实现方式

1.UNPIVOT(Oracle独有)

2.UNION ALL合并结果集

四、行转列练习:CASE WHEN/DECODE/PIVOT/lag/LEAD 

1.CASE WHEN

2.DECODE

3.PIVOT

4.LEAD


一、原始数据

CREATE TABLE T_SCORE (SNO NUMBER,CLA VARCHAR2(20),SCORE NUMBER);INSERT INTO T_SCORE VALUES (101,'语文',88);
INSERT INTO T_SCORE VALUES (101,'数学',89);
INSERT INTO T_SCORE VALUES (101,'英语',90);
INSERT INTO T_SCORE VALUES (102,'语文',91);
INSERT INTO T_SCORE VALUES (102,'数学',77);
INSERT INTO T_SCORE VALUES (102,'英语',56);
INSERT INTO T_SCORE VALUES (103,'语文',77);
INSERT INTO T_SCORE VALUES (103,'数学',88);
INSERT INTO T_SCORE VALUES (103,'英语',99);
INSERT INTO T_SCORE VALUES (104,'语文',77);
INSERT INTO T_SCORE VALUES (104,'数学',66);
INSERT INTO T_SCORE VALUES (104,'英语',55);
INSERT INTO T_SCORE VALUES (105,'语文',44);
INSERT INTO T_SCORE VALUES (105,'数学',67);
INSERT INTO T_SCORE VALUES (105,'英语',78);
INSERT INTO T_SCORE VALUES (106,'语文',89);
INSERT INTO T_SCORE VALUES (106,'数学',98);
INSERT INTO T_SCORE VALUES (106,'英语',78);
INSERT INTO T_SCORE VALUES (107,'语文',67);
INSERT INTO T_SCORE VALUES (107,'数学',56);
INSERT INTO T_SCORE VALUES (107,'英语',54);
INSERT INTO T_SCORE VALUES (108,'语文',76);
INSERT INTO T_SCORE VALUES (108,'数学',78);
INSERT INTO T_SCORE VALUES (108,'英语',12);
COMMIT;SELECT * FROM T_SCORE;

二、行转列的多种实现方式

原格式:

行转列后的格式:

1.CASE WHEN

select SNO, CASE WHEN CLA = '语文' THEN SCORE end as 语文, CASE WHEN CLA = '数学' THEN SCORE end as 数学, CASE WHEN CLA = '英语' THEN SCORE end as 英语
from T_SCORE;

 

下面两种聚合函数都可以: 

select SNO, max(CASE WHEN CLA = '语文' THEN SCORE end) as 语文, max(CASE WHEN CLA = '数学' THEN SCORE end) as 数学, max(CASE WHEN CLA = '英语' THEN SCORE end) as 英语
from T_SCORE
group by SNO
order by SNO;select SNO, sum(CASE WHEN CLA = '语文' THEN SCORE end) as 语文, sum(CASE WHEN CLA = '数学' THEN SCORE end) as 数学, sum(CASE WHEN CLA = '英语' THEN SCORE end) as 英语
from T_SCORE
group by SNO
order by SNO;

二者区别: 

聚合函数逻辑处理重复记录适用场景
MAX返回分组内的最大值。若每组只有一个值,则直接返回该值。保留最大值(如补考成绩)。行转列(提取唯一值)。
SUM返回分组内所有值的总和。若每组只有一个值,则返回该值本身。累加所有值(可能导致成绩异常)。统计总分或合计。

2.DECODE

select SNO, decode(CLA, '语文', SCORE) as 语文, decode(CLA, '数学', SCORE) as 数学, decode(CLA, '英语', SCORE) as 英语
from T_SCORE;

 

select SNO, max(decode(CLA, '语文', SCORE)) as 语文, max(decode(CLA, '数学', SCORE)) as 数学, max(decode(CLA, '英语', SCORE)) as 英语
from T_SCORE
group by SNO
order by SNO;select SNO, sum(decode(CLA, '语文', SCORE)) as 语文, sum(decode(CLA, '数学', SCORE)) as 数学, sum(decode(CLA, '英语', SCORE)) as 英语
from T_SCORE
group by SNO
order by SNO;

 

3.PIVOT(Oracle独有)

语法:

PIVOT (SUM(聚合值) FOR 待转换的列名 IN (待转换的列名里面的值 转换后列的别名))
select *
from T_SCOREPIVOT (sum(SCORE) for CLA in ( '语文' Chinese,'数学' Math,'英语' English))
order by SNO;

4.使用LEAD开窗函数

因为要对中文进行排序,所以先使用ASCII码

SELECT CLA, ASCII(CLA)
FROM T_SCORE
GROUP BY CLA
ORDER BY CLA;

 

SELECT *
FROM (SELECT sno, LEAD(score, 0) OVER (PARTITION BY sno ORDER BY CLA ) 数学, LEAD(score, 1) OVER (PARTITION BY sno ORDER BY CLA ) 英语, LEAD(score, 2) OVER (PARTITION BY sno ORDER BY CLA ) 语文FROM T_SCORE)
WHERE 语文 IS NOT NULL;

 

三、列转行的多种实现方式

DROP TABLE b_score;
CREATE TABLE b_score AS
SELECT *
FROM (SELECT *FROM t_scorePIVOT (SUM(score) -- 聚合函数(使用 SUM 或 MAX 均可)FOR cla IN ('语文' AS 语文, -- 指定课程名称及对应的列别名'数学' AS 数学,'英语' AS 英语)))
ORDER BY sno; -- 按学生编号排序
COMMIT;
SELECT *
FROM b_score;

 原格式:

行转列后的格式:

1.UNPIVOT(Oracle独有)

语法:

UNPIVOT (存储指标值的列名 FOR 合并后的列名 IN (待合并的列名))
SELECT *
FROM b_scoreUNPIVOT (score FOR cla IN (语文,数学,英语));

 

2.UNION ALL合并结果集

SELECT sno,'语文' cla,语文 score FROM b_score
UNION ALL
SELECT sno,'数学' cla,数学 score FROM b_score
UNION ALL
SELECT sno,'英语' cla,英语 score FROM b_score
order by SNO;

 

四、行转列练习:CASE WHEN/DECODE/PIVOT/lag/LEAD 

输出每个部门的总人数,展示样式:

D10  D20  D30

   3      5       6 

1.CASE WHEN

select COUNT(case when DEPTNO = 10 then 1 end) as D10, COUNT(case when DEPTNO = 20 then 1 end) as D20, COUNT(case when DEPTNO = 30 then 1 end) as D30
from EMP;

2.DECODE

select COUNT(DECODE(DEPTNO, 10, 1)) as D10, COUNT(DECODE(DEPTNO, 20, 1)) as D20, COUNT(DECODE(DEPTNO, 30, 1)) as D30
from EMP;

3.PIVOT

SELECT DEPTNO, COUNT(EMPNO) CM
FROM EMP
GROUP BY DEPTNO;

 

select *
from (SELECT DEPTNO, COUNT(EMPNO) CMFROM EMPGROUP BY DEPTNO)pivot (sum(cm) for DEPTNO in (10 D10,20 D20,30 D30));

 

4.LEAD

select DEPTNO, count(empno) ct
from EMP
group by DEPTNO;

 

SELECT *
FROM (select lead(ct, 0) over ( order by DEPTNO) as D10, lead(ct, 1) over ( order by DEPTNO) as D20, lead(ct, 2) over ( order by DEPTNO) as D30from (select DEPTNO, count(empno) ctfrom EMPgroup by DEPTNO)) a
WHERE D30 IS NOT NULL;

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/331.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis实战指南(二)如何实现小鸟图标与导入Teacher数据库表实战

MyBatis实战指南(二)如何实现小鸟图标与导入Teacher数据库表实战 前言一、如何实现小鸟图标二、导入Teacher数据库表实战步骤一:在pojo文件下创建Teacher类步骤二:在mapper下创建TeacherMapper接口步骤三:在rescources…

互联网大厂Java求职面试实录 —— 严肃面试官遇到搞笑水货程序员

互联网大厂Java求职面试实录 —— 严肃面试官遇到搞笑水货程序员 本文以真实场景还原的互联网大厂Java面试故事,严肃的面试官与搞笑的水货程序员谢飞机的对话形式,涵盖核心Java、JUC、多线程、线程池、SpringBoot、MyBatis、Dubbo、RabbitMQ、xxl-job、…

JWT笔记

目录 1.JWT简介2.JWT作用3.传统Session4.JWT的结构5.JWT的请求流程 6.SpringBoot集成JWT 1.JWT简介 JWT(JSON web token),也就是通过JSON形式作为Web应用中的令牌,用于在各方之间安全地将信息作为JSON对象传输,在数据传…

Docker 镜像调试最佳实践

当你已经构建了一个 Docker 镜像,但运行它的容器启动后立即退出(通常是因为服务异常或配置错误),你仍然可以通过以下几种方式进入镜像内部进行调试。 ✅ 最佳实践:如何对一个“启动即退出”的镜像进行命令行调试&#…

TypeScript小技巧使用as const:让类型推断更精准。

文章目录 前言什么是 as const?为什么需要 as const?as const的使用场景1. 保留字面量类型2. 处理元组类型3. 函数调用中的类型匹配 实际应用示例示例 1:配置对象示例 2:枚举替代方案 总结 前言 作为一名前端开发者,在…

LangGraph-agent-天气助手

用于创建agent和多代理工作流 循环(有迭代次数)、可控、持久 安装langgraph包 conda create --name agent python3.12 conda activate agent pip install -U langgraph pip install langchain-openai设置 windows(>结尾) s…

十三种通信接口芯片——《器件手册--通信接口芯片》

目录 通信接口芯片 简述 基本功能 常见类型 应用场景 详尽阐述 1 RS485/RS422芯片 1. RS485和RS422标准 2. 芯片功能 3. 典型芯片及特点 4. 应用场景 5. 设计注意事项 6. 选型建议 2 RS232芯片 1. RS232标准 2. 芯片功能 3. 典型芯片及特点 4. 应用场景 5. 设计注意事项 6…

9大开源AI智能体概况

项目GitHub 链接开发组织核心功能应用领域典型应用案例活跃度AutoGPT (176k⭐)链接Significant Gravitas 团队基于 GPT-4 的自主代理,能够自动分解任务并生成多步提示循环执行,支持调用工具(如网络搜索、文件操作等)。自动化办公、…

kafka吞吐量提升总结

前言 原本自以为阅读了很久kafka的源码,对于kafka的了解已经深入到一定程度了,后面在某大厂的面试中,面试官询问我,如果需要提升kafka的性能,应该怎么做,我发现我能答上来的点非常的少,也暴露了…

OpenHarmony外设驱动使用 (十三),Vibrator

OpenHarmony外设驱动使用 (十三) Vibrator 概述 功能简介 为了快速开发马达驱动,基于HDF(Hardware Driver Foundation)驱动框架开发了马达(Vibrator)驱动模型。马达驱动模型,屏蔽…

【Harmony OS】作业四 布局

目录 一. 单选题(共6题,6分) 1. (单选题, 1分)关于容器组件 Row 和 Column,下面说法错误的是? 2. (单选题, 1分)下列哪种组合方式可以实现子组件从父子组件单向状态同步? 3. (单选题, 1分)下面哪个组件层次结构是错误的&…

嵌入式学习Day27

进程: 进程是操作系统中的一个基本概念,指的是正在执行的程序实例。每个进程都有独立的内存空间、系统资源和执行状态。操作系统通过进程管理来分配资源、调度任务和确保系统的稳定性。 进程的组成 代码段:存储程序的指令。数据段&#xf…