目录

一、原始数据

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

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.pswp.cn/web/81317.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/81317.shtml
英文地址,请注明出处:http://en.pswp.cn/web/81317.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Excel VBA 】窗体控件分类

一、Excel 窗体控件分类 Excel 中的窗体控件分为两大类型,适用于不同的开发需求: 类型所在选项卡特点表单控件开发工具 → 插入 → 表单控件简单易用,直接绑定宏,兼容性好,适合基础自动化操作。ActiveX 控件开发工具…

[ 计算机网络 ] 深入理解OSI七层模型

🎉欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ 🎉感谢各位读者在百忙之中抽出时间来垂阅我的文章,我会尽我所能向的大家分享我的知识和经验📖 🎉希望我们在一篇篇的文章中能够共同进步!!&…

线性代数之张量计算,支撑AI算法的数学原理

目录 一、张量计算的数学本质 1、线性代数:张量的几何与代数性质 2、微积分:梯度与自动微分 3、优化理论:张量分解与正则化 4、张量计算的核心操作 二、张量计算在AI算法中的作用 1、数据表示与处理 2、神经网络的参数表示 3、梯度计算与优化 三、张量计算在AI中的…

打造一个支持MySQL查询的MCP同步插件:Java实现

打造一个支持MySQL查询的MCP同步插件:Java实现 用Java实现一个MCP本地插件,直接通过JDBC操作本地MySQL,并通过STDIO与上层MCP客户端(例如Cursor)通信。插件注册一个名为mysql 的同步工具,接收连接参数及SQL…

【数据架构01】数据技术架构篇

✅ 9张高质量数据架构图:大数据平台功能架构、数据全生命周期管理图、AI技术融合架构等; 🚀无论你是数据架构师、治理专家,还是数字化转型负责人,这份资料库都能为你提供体系化参考,高效解决“架构设计难、…

java三种常见设计模式,工厂、策略、责任链

设计模式实战解析 一、工厂模式(点外卖模式) 1. 核心思想 代替直接new对象像点外卖一样获取对象 2. 实际应用 Spring框架:BeanFactoryJDBC:DriverManager.getConnection() 3. 三种变体对比 类型特点示例场景简单工厂一个工…

jenkins使用Send build artifacts over SSH发布jar包目录配置

本测试用ruoyi-plus的代码。 1 [GitLab 自动触发 Jenkins 构建_jenkins构建触发器没有build when a change is pushed to git-CSDN博客](https://blog.csdn.net/wangyiyungw/article/details/81776972) 2 [jenkins使用Send build artifacts over SSH遇到的坑-CSDN博客](https…

vscode打开vue + element项目

好嘞,我帮你详细整理一个用 VS Code 来可视化开发 Vue Element UI 的完整步骤,让你能舒服地写代码、预览界面、调试和管理项目。 用 VS Code 可视化开发 Vue Element UI 全流程指南 一、准备工作 安装 VS Code 官网下载安装:https://code…

黑马程序员C++2024新版笔记 第4章 函数和结构体

目录 1.结构体的基本应用 2.结构体成员的默认值 3.结构体数组 4.结构体指针 ->操作符 5.结构体指针数组 1.引入已存在的结构体数组地址 2.通过new操作符申请指针数组空间 6.函数的概念 7.函数的基础语法 8.无返回值函数和void类型 9.空参函数 10.函数的嵌套调用…

高级前端工程师必备的 JS 设计模式入门教程,常用设计模式案例分享

目录 高级前端工程师必备的 JS 设计模式入门教程,常用设计模式案例分享 一、什么是设计模式?为什么前端也要学? 1、设计模式是什么 2、设计模式的产出 二、设计模式在 JS 里的分类 三、常用设计模式实战讲解 1、单例模式(S…

Ubuntu+Docker+内网穿透:保姆级教程实现安卓开发环境远程部署

文章目录 前言1. 虚拟化环境检查2. Android 模拟器部署3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问小结 6. 固定Cpolar公网地址7. 固定地址访问 前言 本文将详细介绍一种创新性的云开发架构:基于Ubuntu系统构建Android仿真容器环境,并集成安全隧道技…

Linux Kernel调试:强大的printk(一)

引言 想了好久,还是觉得这个标题才配得上printk!^_^ 我相信,不管做什么开发,使用最多的调试手段应该就是打印了,从我们学习编程语言第一课开始,写的第一段代码,就是打印"Hello, world&qu…

基于NLP技术的客户投诉与需求文本分类方法研究

目录 摘要 1. 引言 2. 文本分类基础 2.1 文本分类的定义与类型 2.2 文本分类的评价指标 3. 传统文本分类方法 3.1 基于TF-IDF和SVM的方法 3.2 基于主题模型和词向量的改进方法 4. 深度学习文本分类方法 4.1 TextCNN模型 4.2 BiLSTM模型 4.3 注意力机制与Transformer…

#RabbitMQ# 消息队列入门

目录 一 MQ技术选型 1 运行rabbitmq 2 基本介绍 3 快速入门 1 交换机负责路由消息给队列 2 数据隔离 二 Java客户端 1 快速入门 2 WorkQueue 3 FanOut交换机 4 Direct交换机 5 Topic交换机 *6 声明队列交换机 1 在配置类当中声明 2 使用注解的方式指定 7 消息转…

【深度学习】多目标融合算法(六):渐进式分层提取模型PLE(Progressive Layered Extraction)

目录 一、引言 二、PLE(Progressive Layered Extraction,渐进式分层提取模型) 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 2.3.1 业务场景与建模 2.3.2 模型代码实现 2.3.3 模型训练与推理测试 2.3.4 打印模型结构 三、总结 一…

【Java开发日记】如何使用Java开发在线生成 pdf 文档

一、介绍 在实际的业务开发的时候,研发人员往往会碰到很多这样的一些场景,需要提供相关的电子凭证信息给用户,例如网银/支付宝/微信购物支付的电子发票、订单的库存打印单、各种电子签署合同等等,以方便用…

Oracle 11g 单实例使用+asm修改主机名导致ORA-29701 故障分析

解决 把服务器名修改为原来的,重启服务器。 故障 建表空间失败。 分析 查看告警日志 ORA-1119 signalled during: create tablespace splex datafile ‘DATA’ size 2000M… Tue May 20 18:04:28 2025 create tablespace splex datafile ‘DATA/option/dataf…

消息队列的使用

使用内存队列来处理基于内存的【生产者-消费者】场景 思考和使用Disruptor Disruptor可以实现单个或多个生产者生产消息,单个或多个消费者消息,且消费者之间可以存在消费消息的依赖关系 使用Disruptor需要结合业务特性,设计要灵活 什么业务…

《帝国时代1》游戏秘籍

资源类 PEPPERONI PIZZA:获得 1000 食物。COINAGE:获得 1000 金。WOODSTOCK:获得 1000 木头。QUARRY:获得 1000 石头。 建筑与生产类 STEROIDS:快速建筑。 地图类 REVEAL MAP:显示所有地图。NO FOG&#xf…

使用JSP踩过的坑

虽然说jsp已经过时了,但是有时维护比较老的项目还是需要的。 下面说下,我使用jsp踩过的坑: 1.关于打印输出 在jsp中输出使用 out.println("hello");而不是 System.out.println("hello");如果在定义函数部分需要打印…