【SQL应知应会】行列转换(三)• Oracle版

news2024/11/28 14:30:24

请添加图片描述

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流

本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle

请添加图片描述

行列转换 • Oracle版

  • oracle的行列转换
  • 前言
  • 1.数据准备
    • 1.1知识点补充
    • 1.2 知识点应用
  • 2.行转列
    • 2.1通用的行转列(Mysql和Oracle都能用) ——> case when
    • 2.2 私有方法的行转列(Oracle用) ——> decode()
    • 2.3 终极方法(Oracle用) ——> 透视表函数pivot()
      • 2.3.1理论
      • 2.3.2 应用
      • 2.3.3美化
  • 3.列转行
    • 3.1`with as`
    • 3.2进行一个列转行的操作(这是通用方法) ——> union
    • 3.3 列转行终极方法(Oracle用) ——> unpivot()
    • 3.4 一个学生一门课有多次成绩的时候
  • 小结

oracle的行列转换

前言

前面的两篇文章【SQL应知应会】行列转换(一)• MySQL版和【SQL应知应会】行列转换(二)• MySQL版详细的讲述了MySQL的行列转换,而今天这篇文章,讲的是Oracle中的行列转换,其中有与MySQL共同的方法,也有Oracle专用的方法,希望对大家在学习上能有所帮助。

1.数据准备

1.1知识点补充

create table table_grade(id int,user_name varchar(20),course varchar(10),score decimal(5,2));

oracle 中没有int,有integer类型,不过兼容 oracle没有double
oracle没有varchar类型,有varchar2,不过使用varchar也可以建
decimal有,但是建进去会变成number,number既支持整数又支持小数,最大可以设置到38位

drop table table_grade purge;

oracle 删除的时候要加purge,因为oracle有回收站机制,不加purge的话会将删除的东西放在回收站中,这样的话,之后还需要进行一个recyclebin的操作

PURGE RECYCLEBIN; -- 清空某一用户的所有表空间下的对象

1.2 知识点应用

create table table_grade (id number(38),user_name varchar(20),course varchar(10),score decimal(5));

insert into table_grade values('1','张龙','语文','78');
insert into table_grade values('2','张龙','数学','95');
insert into table_grade values('3','张龙','英语','81');
insert into table_grade values('4','赵虎','语文','97');
insert into table_grade values('5','赵虎','数学','78');
insert into table_grade values('6','赵虎','英语','91');
insert into table_grade values('7','王五','语文','81');
insert into table_grade values('8','王五','数学','55');
insert into table_grade values('9','王五','英语','75');
insert into table_grade values('10','马六','语文','87');
insert into table_grade values('11','马六','数学','65');
insert into table_grade values('12','马六','英语','75');

commit; -- 插入数据后,需要进行一个提交

2.行转列

2.1通用的行转列(Mysql和Oracle都能用) ——> case when

select id "学生ID",    -- oracle中单引号被识别为字段里的一个值,所以别名使用双引号 -- 我的猜想:好像加as就可以用单引号了--> 没验证成功
			 (select max(user_name) from table_grade where id = t.id) user_name,
			 max(case when course = '语文' then score end) "语文",
			 max(case when course = '数学' then score end) "数学",
			 max(case when course = '英语' then score end) "英语"
from table_grade
group by id;

2.2 私有方法的行转列(Oracle用) ——> decode()

select id "学生ID",
			 (select max(user_name) from table_grade where id = t.id) user_name,
			 max(decode(course,'语文',score,'')) "语文",
			 max(decode(course,'数学',score,'')) "数学",
			 max(decode(course,'英语',score,'')) "英语"
from table_grade t
group by id order by 1

-- decode(字段或字段的运算,值1,值2,值3)
   -- 当字段或字段的运算的值等于值1时,该函数返回值2,否则返回值3
	 -- 当然值1,值2,值3也可以是表达式,这个函数使得某些sql语句简单了许多

2.3 终极方法(Oracle用) ——> 透视表函数pivot()

2.3.1理论

select * from table_name
pivot(max(column_name)   -- 行转列后的列的值value,聚合函数是必须要有的
	for column_name in (value_1,value_2,value_3)) -- 需要行转列的列及其对应的属性1/2/3

2.3.2 应用

select * from table_grade 
pivot(max(score)   -- 此处max()改成min/sum/avg是一样的,因为此时的table_grade表中,一个学生每门课就有一个成绩
	for course in ('语文' 语文,'数学' 数学,'英语' 英语))  -- 先写值value,因为course是字符串,所以加单引号   后面是别名

2.3.3美化

select user_name,语文,数学,英语 from table_grade 
pivot(max(score)
	for course in ('语文' 语文,'数学' 数学,'英语' 英语)) 
order by user_name 

3.列转行

3.1with as

  • with as 是oracle特有写法,可以将as中的查询当做一个表来使用
with table_grade_wide 
as (select user_name "姓名",
					 max(case when course = '语文' then score end) "语文",
					 max(case when course = '数学' then score end) "数学",
					 max(case when course = '英语' then score end) "英语"
		 from table_grade t
		 group by user_name)
  • 然后就可以当做一个表使用了
  select * from table_grade_wide 

3.2进行一个列转行的操作(这是通用方法) ——> union

- select * from (
  	select 姓名,'语文' course,语文 score from table_grade_wide
  	union  -- 如果此处使用union all 的话,和union是没有区别的,前一句是赋值语文,下一句是赋值数学,二者union不会去重,相当于产生一个course字段分别是语文和数学,所以二者去重是不会消掉数据的
  	select 姓名,'数学' ,数学 from table_grade_wide
  	union
  	select 姓名,'英语' ,英语 from table_grade_wide) -- a -- 这里这个虚拟的表就可以当做真实的表来使用了,所以就不需要给它别名了 -- ?为什么可以当做真实的表用了?这是oracle的原因吗
  -- where score id not null 	 -- 这句如果原来表中有的学生就没有其中一门课的数据,比如王五和马六只有两门课的数据,那就可以通过这句话来解决table_grade_wide表中王五和马六对应的没有的那门课的null;如果表中的学生有课但是成绩是null,那就没有必要使用这句代码,不然就把学生拥有的那门课删掉了,相当于造成了数据丢失
  order by 姓名 

3.3 列转行终极方法(Oracle用) ——> unpivot()

with table_grade_wide 
as (select user_name "姓名",
					 max(case when course = '语文' then score end) "语文",
					 max(case when course = '数学' then score end) "数学",
					 max(case when course = '英语' then score end) "英语"
		 from table_grade t
		 group by user_name)
select 姓名 user_name,course,score from table_grade_wide unpivot(score for course in (语文,数学,英语)) 

3.4 一个学生一门课有多次成绩的时候

  • 数据准备
    在这里插入图片描述
  • 代码
# 求一个学生每门课程近三次考试中最高的成绩
SELECT t1.s_id,t1.c_id, MAX(t1.score) AS best_score
FROM (
  SELECT s_id,c_id, score, 
         ROW_NUMBER() OVER (PARTITION BY s_id,c_id ORDER BY exam_date DESC) AS rn
  FROM sc
) t1
WHERE t1.rn <= 3
GROUP BY t1.s_id,t1.c_id

小结

好了,Oracle的行列转换到这里就要告一段落了,相信大家通过前两篇文章【SQL应知应会】行列转换(一)• MySQL版和【SQL应知应会】行列转换(二)• MySQL版,应该对MySQL的行列转换有了了解,并且通过今天这篇文章对Oracle的行列转换也进行了学习,应该对MySQL和Oracle的行列转换的相同以及不同之处有所了解,那么数据库的行列转换这一模块我们就告一段落了,接下来还会给大家带来其他方面的知识讲解,希望能对大家有所帮助
请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Perhaps you are running on a JRE rather than a JDK?

我记得我遇到过好多次 mvn clean package的时候报错&#xff1b; 最后检查时这里的路径配置错了

蓝牙耳机品牌排行榜前十名!2023年超全蓝牙耳机合集!

虽然称不上发烧友&#xff0c;但近年来用过的蓝牙耳机少说也有几十款了。这篇文章以近年来市面上的热销且评价都比较高的十款蓝牙耳机为主要推荐对象&#xff0c;来给大家做一期有关于蓝牙耳机的实测体验以及提供相关的选购思路&#xff0c;希望能为大家的选择出一份力。 第一…

# TSWIKI 0.2 版本

TSWIKI 0.2 版本 TSWIKI 0.2 版本经过这段时间的改进&#xff0c;增加了搜索&#xff0c;版本变更查看等功能&#xff0c;基本开发完成。功能方面已经与 gollum 类似。 功能改进说明 1、GIT 版本变更查看功能 实现 git 版本变更查看功能, 在 markdown 文档查看界面&#xf…

day 44 完全背包

完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同…

LLVM介绍

LLVM项目是什么 工业级编译技术集合 优化器和代码生成器llvm-gcc和Clang前端MSIL和.NET虚拟机开源项目 行业组织、研究团体和个人 LLVM愿景 主要使命&#xff1a;构建一套模块化的编译器组件&#xff1a; 减少构建特定编译器的时间和成本组件可以在不同的编译器之间共享使用…

OpenCat:一个基于Arduino和Raspberry Pi的开源四足机器人宠物框架

一个深圳项目&#xff0c;OpenCat&#xff1a;一个基于Arduino和Raspberry Pi的开源四足机器人宠物框架。 项目灵感来自于到波士顿动力公司Big Dog和Spot Mini的启发。 OpenCat提供了一个基础的开源平台&#xff0c;可以创建令人惊奇的可编程步态、运动四足机器人。它可以进行复…

什么是孪生视频,孪生视频是什么意思,她的关键技术,及应用场景案例

视频孪生&#xff0c;即视频数字孪生。是集三维地理信息系统、视频虚实融合、数字孪生、人工智能、时空位置智能、地球空间网格编码、知识图谱于一体的多学科、多维度、多尺度的综合技术应用&#xff0c;是对数字孪生的创新升级。 什么是视频孪生&#xff0c;视频孪生的关键技术…

c++ 之decay简单介绍

简介 std::decay是C获取类型的一种方式&#xff0c;它定义在<type_traits>头文件中。 #include <type_traits>模型 template< class T > using decay_t typename decay<T>::type; //(since C14)使用示例 template<typename T> static void …

关于流程图svg线条流动的效果-jq

获取所有的SVG并加上相应的样式 var svgElement $(svg.jtk-connector);console.info(svgElement,svgElement)var pathElement svgElement.find(path:first);pathElement.attr(class, connector-line);pathElement.attr(fill, transparent);pathElement.attr(stroke, #1890ff)…

vue3项目打开本地pdf文件实现方法

vue3项目打开本地pdf文件实现方法 效果图引入pdf插件pdf页面封装pdf存放目录结语 效果图 引入pdf插件 注意一定要这个版本&#xff0c;不然会报错key.split(...).at is not a function npm install pdfjs-dist2.12.313pdf页面封装 <template><div class"pdf-co…

饮料市场京东销售数据分析(京东大数据)

近日&#xff0c;关于“阿斯巴甜可能是致癌物”的话题持续发酵&#xff0c;众所周知阿斯巴甜是常见的人工甜味剂之一&#xff0c;并被广泛应用于无糖可乐以及一些饮料产品中&#xff0c;而这一话题引起人们的巨大恐慌。 阿斯巴甜致癌与否尚未定论&#xff0c;但这一言论也引得…

【学习笔记-QGIS】 QGIS从零快速上手

原文感谢作者才华横溢吴道简 安装文章参考&#xff1a;https://zhuanlan.zhihu.com/p/370633306 一、下载安装 QGIS免费开源&#xff0c;中文界面&#xff0c;下载地址&#xff1a;https://download.qgis.org/downloads/ 三、配置中文环境 开始——QGIS 3.18——QGIS Deskto…

SpringBoot2+Vue2实战(十)权限管理之动态菜单、动态路由生成

一、父子菜单实现 新建数据库表 sys_menu sys_role 实体类 Role import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName;import java.io.Serializable;import l…

Numpy速通笔记

Numpy可以高效处理大数组的数据&#xff0c;因为&#xff1a; Numpy在一个连续的内存块中存储数据&#xff0c;独立于其他Python内置对象。Numpy是C写的&#xff0c;有优化&#xff0c;比Python内置序列使用的内存少可以在整个数组上进行复杂运算&#xff0c;不需要for循环 下…

table的tr动态增加(含html示例)

html页面table的tr动态增加&#xff08;含示例&#xff09; 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>简单示例</title><script type"text/javascript">function …

陶建辉在“2023 可信数据库发展大会”发表演讲,TDengine 入选中国数据库产业图谱

当前&#xff0c;全球数字经济加速发展&#xff0c;数据正在成为重组全球要素资源、重塑全球经济结构、改变全球竞争格局的关键力量。数据库作为存储与处理数据的关键技术&#xff0c;在数字经济大浪潮下&#xff0c;全球数据库产业中新技术、新业态、新模式不断涌现。 7 月 4…

mysql创建表练习

CREATE TABLE student ( Id int(10) primary key auto_increment comment "学号", Name varchar(20) not null comment "姓名", Sex enum(M,F) default M comment "性别", Birth year(4) comment "出生年份", Department varchar(20)…

-XX:+PrintCommandLineFlags

-XX:PrintCommandLineFlags把传递给虚拟机的参数输出&#xff08;隐式传递显式传递&#xff09;控制台打印信息-XX:ConcGCThreads3 -XX:G1ConcRefinementThreads13 -XX:GCDrainStackTargetSize64 -XX:InitialHeapSize254884992 -XX:MarkStackSize4194304 -XX:MaxHeapSize407815…

从混沌到秩序的蜕变,SRE解码云计算运维奥秘

什么是SRE SRE&#xff08;Site Reliability Engineering&#xff09;即站点可靠性工程&#xff0c;最初由Google公司提出&#xff0c;通过将开发、运维等多方面进行整合&#xff0c;协同推进系统可靠性&#xff0c;从而确保业务服务能够持久运行。 这是一种新的模式&#xff0…

7.6机试练习

1. 2105 IP Address 描述 Suppose you are reading byte streams from any device, representing IP addresses. Your task is to convert a 32 characters long sequence of ‘1s’ and ‘0s’ (bits) to a dotted decimal format. A dotted decimal format for an IP addres…