Oracle——行转列与列转行
文章目录
- 行转列
- 创建表和增加测试数据
- 方式一:先分组,再统计平铺
- 方式二:使用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 * from 表
PIVOT (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(语文,数学,理综));
总结
pivot
和unpivot
不太好理解,并且属于oracle
特有,针对别的类型数据库,可能方式一更好点。
资料参考
oracle怎么实现行列转换
Oracle——行转列与列转行相关推荐
- ORACLE行转列和列转行
文章目录 ORACLE行转列和列转行 定义 ORACLE-行转列-unpivot 数据准备 行转列使用 ORACLE-列转行-pivot 数据准备 列转行使用 ORACLE行转列和列转行 定义 行转列 ...
- Oracle 行转列——列转行
工作中,我们经常会碰到行转列的情况 这里我介绍几种简单的方法--行转列 1.oracle的pivot函数 原表 使用pivot函数: with temp as( select '四川省' nation ...
- oracle系列–行转列、列转行
oracle行转列.oracle列转行 以及 mysql列转行,mysql行转列 文章目录 前言 一.oracle:逗号分隔的一列转行 二.oracle:多列转行 unpivot 函数 三.oracl ...
- oracle列转行用法,oracle 行转列 列转行
1.概述 最近论坛很多人提的问题都与行列转换有关系,所以我对行列转换的相关知识做了一个总结,希望对大家有所帮助,同时有何错疏,恳请大家指出,我也是在写作过程中学习,算是一起和大家学习吧! 行列转换包括 ...
- Oracle行转列(pivot)和Oracle列转行(unpivot)
行变列,列变行在生成报表的时候经常遇到,行变列叫做"Pivot", 反之叫做"Unpivot". 在Oracle11g之前,一般都是通过case来实现,但是Or ...
- oracle 行转列后列名,Oracle 多行转多列,列值转为列名
前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要导出问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的,,终于功夫不负有心人 然后最终自己写出来了 ...
- oracle一列多行转一行多列表示,Oracle 多行转多列,列值转为列名
前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要导出问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的,,终于功夫不负有心人 然后最终自己写出来了 ...
- matlab 列转行,postgresql 行转列,列转行后加入到一个整体数据
这里行转列的基本思想就是使用max,因为其他列下面都是NULL,所以可以Max最后就只能得到有值的这行 普通的查询: SELECT icd , case when (ROW_NUMBER() OVER ...
- mysql行转列和列转行_mysql 行转列和列转行实例详解
mysql行转列.列转行 语句不难,不做多余解释了,看语句时,从内往外一句一句剖析 行转列 有如图所示的表,现在希望查询的结果将行转成列 建表语句如下: create table `test_tb_g ...
最新文章
- 这就是奇客文化?简直太有才了!
- Windows Server下DB2自动备份、复原和前滚的脚本编程
- 学python用什么系统好-初次接触python,怎么样系统的自学呢?
- oracle 创建nchar类型,nchar类型的用法!
- Photoshop显示RGB值问题
- SAP Spartacus 单元测试开发规范
- 蓝牙版本avrcp怎么选_500元内无线蓝牙耳机测评年轻人的第一款廉价蓝牙耳机怎么选?...
- Cross Entropy Loss 交叉熵损失函数公式推导
- Git、Github、Gitlab、Gitee、Git-ce的区别
- 2.4 理解指数加权平均
- GIT 之概述与架构
- java 皮尔逊相关系数_皮尔逊相关系数
- e站app里站hosts_硬核干货区 | E站的国际站运营知识星球上线啦
- css 设置打印a4,CSS设置A4纸大小。
- 客户端设置超时,max_fails失效----问题分析
- Docker 删除image
- Python的len函数探究
- 如何判断Hadoop集群是否搭建成功
- 易语言误报优化助手 v1.5
- STM32H7外设配置速查【QSPI部分】