Oracle——行转列与列转行

news/2024/5/9 3:20:56/文章来源:https://blog.csdn.net/qq_38322527/article/details/127445099

文章目录

  • 行转列
    • 创建表和增加测试数据
    • 方式一:先分组,再统计平铺
    • 方式二:使用Oracle11g自带函数PIVOT实现
  • 列转行
    • 创建表和增加测试数据
    • 方式一:union all 单个合并
    • 方式二:unpivot 函数实现
  • 总结
  • 资料参考

行转列

把某一个字段的值作为唯一值,然后另外一个字段的行值转换成它的列值

转换过程大致如下所示:
在这里插入图片描述
通常情况下,采取group by 唯一字段进行分组,然后依据不同的列进行判断输出就能转换。

创建表和增加测试数据

建表语句和增加测试数据sql如下所示:

create table XJ_TEST_LtoH(stuid varchar(20),stuname varchar(40),coursename varchar(40),score int
);insert into XJ_TEST_LtoH(stuid,Stuname,coursename,score)
values('sc202201001','张三','数学',40);
insert into XJ_TEST_LtoH(stuid,Stuname,coursename,score)
values('sc202201001','张三','语文',50);
insert into XJ_TEST_LtoH(stuid,Stuname,coursename,score)
values('sc202201001','张三','理综',120);
insert into XJ_TEST_LtoH(stuid,Stuname,coursename,score)
values('sc202201011','李四','数学',32);
insert into XJ_TEST_LtoH(stuid,Stuname,coursename,score)
values('sc202201011','李四','语文',45);
insert into XJ_TEST_LtoH(stuid,Stuname,coursename,score)
values('sc202201011','李四','理综',123);
insert into XJ_TEST_LtoH(stuid,Stuname,coursename,score)
values('sc202201031','王五','数学',54);
insert into XJ_TEST_LtoH(stuid,Stuname,coursename,score)
values('sc202201031','王五','语文',56);
insert into XJ_TEST_LtoH(stuid,Stuname,coursename,score)
values('sc202201031','王五','理综',100);

执行完毕后,数据库中当前的数据结构如下:
在这里插入图片描述

同所属的类,对应不同的值,采取不同列进行存储。

方式一:先分组,再统计平铺

将数据根据学员名分组,将学科成绩平铺展示。sql如下所示:

-- 方式一:先分组,再单元拆分
select 
t.stuid,
t.stuname ,
sum(decode(t.coursename,'数学',t.score,0)) "数学",
sum(decode(t.coursename,'语文',t.score,0)) "语文",
sum(decode(t.coursename,'理综',t.score,0)) "理综"
from XJ_TEST_LtoH t group by t.stuname,t.stuid;

在这里插入图片描述

方式二:使用Oracle11g自带函数PIVOT实现

Oracle11g及以后自带函数PIVOT就能实现上述的效果,且代码量很小。

select * fromPIVOT (sum(xxx /**行转列需要显示数据的列**/) for XXX   /**需要行转列的列**/ in(mm,nn) /**转换后列的值**/
)

具体的使用方式,如下:

-- 方式二:Oracle11g之后提供了自带函数PIVOT
select * from XJ_TEST_LtoH 
pivot (sum(score /**行转列需要显示数据的列**/) forcoursename /**需要行转列的列**/ in('语文' as 语文,'数学' as 数学,'理综' as 理综) /**转换后列的值**/
);

在这里插入图片描述

列转行

把一行当中的列的字段按照行的唯一值转换成多行数据。

还是上面的栗子,先创建测试表和增加测试数据。

创建表和增加测试数据

------ 列转行前的表创建
create table XJ_TEST_HL as (
select 
t.stuid,
t.stuname ,
sum(decode(t.coursename,'数学',t.score,0)) "数学",
sum(decode(t.coursename,'语文',t.score,0)) "语文",
sum(decode(t.coursename,'理综',t.score,0)) "理综"
from XJ_TEST_LtoH t group by t.stuname,t.stuid);

这种语法,就能直接将查询到的数据信息,以及表结构中字段类型等信息,映射成一张新的表。

此时的数据结构如下所示:
在这里插入图片描述

方式一:union all 单个合并

查询每个需要拆分的列数据信息,以相同的列名接收,再将数据合并。

-- 方式一:先查询单个,再将所有数据拼接
select * from (
select t.stuid,t.stuname,'语文' as coursename,t.语文 as score from XJ_TEST_HL t
union all
select t.stuid,t.stuname,'数学' as coursename,t.数学 as score from XJ_TEST_HL t
union all
select t.stuid,t.stuname,'理综' as coursename,t.理综 as score from XJ_TEST_HL t
) p order by p.stuname;

在这里插入图片描述

方式二:unpivot 函数实现

语法如下所示:

select 字段 from 数据集unpivot(自定义列名/*列的值*/ for 自定义列名 in(列名))

【注意】这里的是 unpivot ,不是 pivot !

-- 方式二
-- 语法  select 字段 from 数据集 unpivot(自定义列名/*列的值*/ for 自定义列名 in(列名))
select * from XJ_TEST_HL
unpivot (score for coursename in(语文,数学,理综));

在这里插入图片描述

总结

pivotunpivot不太好理解,并且属于oracle特有,针对别的类型数据库,可能方式一更好点。

资料参考

oracle怎么实现行列转换

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

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

相关文章

Js中六种拖拽(拉)事件(drag 和 drop)

拖拽事件 今天同事问有没有实现过表格的拖拽功能,我当时想的是应该跟图片的拖拽代码逻辑是一样的主要是使用了浏览器中的以下几个事件 例如: 一、dragstart 二、dragend 三、dragover 四、dragenter 五、drop 等 文章目录拖拽事件前言(各个浏览器的兼容性…

基于matlab的神经网络设计,深度神经网络代码matlab

为什么谈论深度学习工具时,很少有人讨论matlab的神经网络工具包 首先深度学习不光是在学术界非常火热, 在工业界也有着大量的运用, 这就要求深度学习框架要方便在服务器上部署, 而这个恰恰是Matlab的软肋, 想象一下你前端用个Django做个页面接受用户输入的图像, 后…

【Linux驱动开发】并发控制机制:原子操作、自旋锁、信号量、互斥锁详解

并发控制机制 首先我们来了解一下 “操作系统的并发性” 这个概念: 操作系统的并发性(concurrence):指的是两个或者两个以上事件在同一时间间隔内发生,即这个设备一会执行这个事件一会执行那个事件,多个事件共同使用一个设备。 操…

yolov5和yolov7之实例分割训练

还没来得及实验,我在这里就给出几个参考的链接 1、How to train your segmentation data with seg in U7? What is the data set format?Thanks!! Issue #732 WongKinYiu/yolov7 GitHub 2、JSON2YOLO/general_json2yolo.py at master …

南大通用GBase8s 常用SQL语句(287)

UPDATE 语句 使用 UPDATE 语句来更改表或视图中一个或多个现有的行的一个或多个列中的值。 语法 Target WHERE 选项 元素 描述 限制 语法 alias 您在此为本地表或远程表声明的临时的名称 如果 SET 是 alias 的标识符,则 AS 关键字必须在 alias 之前 …

计算机网络(六) | 应用层:HTTP协议详解

目录HTTP协议HTTP协议简介理解应用层协议HTTP协议的工作过程HTTP协议格式Fiddler的简介Fiddler的使用HTTP请求格式概述HTTP响应格式概述HTTP请求格式详解URL方法请求报头请求正文(body)HTTP响应格式详解状态码响应报头响应正文(body)构造HTTP请求form表单构造HTTP请求通过ajax构…

Unity9 路径权限、场景的加载、异步加载、场景跳转

Application类 using System.Collections; using System.Collections.Generic; using UnityEngine;public class ApplicationTest : MonoBehaviour {// Start is called before the first frame updatevoid Start(){//游戏数据文件夹路径 只读、加密压缩Debug.Log(Application…

华为云数据库GaussDB(for MySQL)携高新技术强势而来

华为云数据库GaussDB(for MySQL)携高新技术强势而来 企业数据库堪比人的心脏一样重要,不仅要承担企业数据存储、维护、管理、分析等任务,还要保证企业数据的完整性和准确性,并且需要承载着对其他业务系统或客户信息进行整合处理的功能&#x…

网课搜题公众号在线查题系统

网课搜题公众号在线查题系统 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后台&#xf…

【学习笔记】JSP内置对象

JSP内置对象pageContextRequestResponseconfig [ServletConfig]outApplication [ServletContext]pageexceptionsession 其中,pageContext、Request、Application、session 用于存储数据 它们都使用setAttribute() 来存数据 <% pageContext.setAttribute("name1&quo…

Dubbo的简单使用

一、架构演进 发展演变1.1 单一应用架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。适用于小型网站,小型管理系统,将所有功能都部署到一个功能里,简单易用。 缺点性能扩展…

操作系统:文件IO

文章目录文件描述符文件描述符池基本文件操作openopen返回文件描述符的规则open的文件描述符与fopen的文件指针closewritereadlseekfcntl共享文件操作同一进程&#xff0c;多次open同一文件多个进程&#xff0c;多次open同一文件dupdup2利用dup、dup2实现重定位高级文件IO非阻塞…

【网络安全-键盘监视】学会以后去捉弄舍友,看他有了什么不可告人的秘密

&#x1f343;博主昵称&#xff1a;一拳必胜客 博主主页面链接&#xff1a;博主主页传送门 博主专栏页面连接&#xff1a;专栏传送门–计算机考研 &#x1f351;创作初心&#xff1a;本博客的初心是每天分享记录自己学习的脚步&#xff0c;和各位技术友探讨交流&#xff0c;同时…

通过jmap、jstack分析问题,以及分析方法

一、问题 多批次导入任务&#xff0c;会出现异步线程停止工作的情况&#xff0c;后续无论导入多少任务&#xff0c;异步线程都不会执行&#xff0c;只有重启能解决。 二、工具使用 进入jdk的bin目录&#xff1a; cd /beeb/ap/uip/jdk1.8.0_231/bin 2.1 拉取jstack日志&…

setContentView源码解析

一、引言 本文将解析activity加载布局文件的setContentView源码&#xff0c;由于会涉及到部分activity的启动流程&#xff0c;这里附上一张activity启动流程图&#xff1a; 关于 setContentView 源码分两种情况&#xff0c;因为我们的 activity 有两个&#xff1a; 一种是继…

halcon脚本-边缘及骨架的识别【附源码】

文章目录前言一、原图1.边缘图2.骨架图二、实现思路1.边缘图2.骨架图三、halcon脚本实现1.边缘图2.骨架图四、实现效果1.边缘图2.骨架图前言 本文实现基于图像进行边缘或者骨架的识别&#xff0c;可实现让机器人画画 一、原图 1.边缘图 2.骨架图 二、实现思路 1.边缘图 提取…

【阅读】一周翻过《构建之法》,笔记整理

文章目录&#x1f6a9; 前言&#x1f966; 阅读笔记&#x1f33e; 结语&#x1f6a9; 前言 我的阅读方式 我拿到这本书挺久了&#xff0c;之前已经零散地看过一部分&#xff0c;最近一周集中地花了一些时间&#xff0c;将整本书看过了一遍。看得比较粗略&#xff0c;正如“好读…

怎么管理员工混工时的现象?

如果员工存在混工时&#xff0c;这表明公司的管理存在漏洞。让懒散的员工认为自己可以混日子&#xff0c;让没有绩效考核的员工默认可以混日子&#xff0c;同时让对公司感到失望的员工可以完全躺平等待被公司解雇。 工时管理一直是企业需求与痛点。特别是在疫情时期&#xff0c…

华为云数据库GaussDB 为企业核心数据运行提供优质保障

华为云数据库GaussDB 为企业核心数据运行提供优质保障 在网络信息科学技术不断发展的今天&#xff0c;海量存储信息数据中大量的存储资源被浪费&#xff1f;你有没有遇见信息数据备份恢复很慢的情况&#xff1f;让人特别的烦躁&#xff0c;特别是企业遇见了这些情况&#xff0c…

JDBC工具类和JDBC登录案例

JDBC工具类: 抽取JDBC工具类:JDBCUtils 目的:简化书写 分析∶ 1.注册驱动也抽取 2.抽取一个方法获取连接对象 3.抽取一个方法释放资源 代码实现:/*** JDBC工具类*/ public class JDBCUtils {private static String url;private static String user;private static Strin…