文章目录

  • 行转列
    • 创建表和增加测试数据
    • 方式一:先分组,再统计平铺
    • 方式二:使用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(语文,数学,理综));

总结

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

资料参考

oracle怎么实现行列转换

Oracle——行转列与列转行相关推荐

  1. ORACLE行转列和列转行

    文章目录 ORACLE行转列和列转行 定义 ORACLE-行转列-unpivot 数据准备 行转列使用 ORACLE-列转行-pivot 数据准备 列转行使用 ORACLE行转列和列转行 定义 行转列 ...

  2. Oracle 行转列——列转行

    工作中,我们经常会碰到行转列的情况 这里我介绍几种简单的方法--行转列 1.oracle的pivot函数 原表 使用pivot函数: with temp as( select '四川省' nation ...

  3. oracle系列–行转列、列转行

    oracle行转列.oracle列转行 以及 mysql列转行,mysql行转列 文章目录 前言 一.oracle:逗号分隔的一列转行 二.oracle:多列转行 unpivot 函数 三.oracl ...

  4. oracle列转行用法,oracle 行转列 列转行

    1.概述 最近论坛很多人提的问题都与行列转换有关系,所以我对行列转换的相关知识做了一个总结,希望对大家有所帮助,同时有何错疏,恳请大家指出,我也是在写作过程中学习,算是一起和大家学习吧! 行列转换包括 ...

  5. Oracle行转列(pivot)和Oracle列转行(unpivot)

    行变列,列变行在生成报表的时候经常遇到,行变列叫做"Pivot", 反之叫做"Unpivot". 在Oracle11g之前,一般都是通过case来实现,但是Or ...

  6. oracle 行转列后列名,Oracle 多行转多列,列值转为列名

    前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要导出问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的,,终于功夫不负有心人 然后最终自己写出来了 ...

  7. oracle一列多行转一行多列表示,Oracle 多行转多列,列值转为列名

    前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要导出问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的,,终于功夫不负有心人 然后最终自己写出来了 ...

  8. matlab 列转行,postgresql 行转列,列转行后加入到一个整体数据

    这里行转列的基本思想就是使用max,因为其他列下面都是NULL,所以可以Max最后就只能得到有值的这行 普通的查询: SELECT icd , case when (ROW_NUMBER() OVER ...

  9. mysql行转列和列转行_mysql 行转列和列转行实例详解

    mysql行转列.列转行 语句不难,不做多余解释了,看语句时,从内往外一句一句剖析 行转列 有如图所示的表,现在希望查询的结果将行转成列 建表语句如下: create table `test_tb_g ...

最新文章

  1. 这就是奇客文化?简直太有才了!
  2. Windows Server下DB2自动备份、复原和前滚的脚本编程
  3. 学python用什么系统好-初次接触python,怎么样系统的自学呢?
  4. oracle 创建nchar类型,nchar类型的用法!
  5. Photoshop显示RGB值问题
  6. SAP Spartacus 单元测试开发规范
  7. 蓝牙版本avrcp怎么选_500元内无线蓝牙耳机测评年轻人的第一款廉价蓝牙耳机怎么选?...
  8. Cross Entropy Loss 交叉熵损失函数公式推导
  9. Git、Github、Gitlab、Gitee、Git-ce的区别
  10. 2.4 理解指数加权平均
  11. GIT 之概述与架构
  12. java 皮尔逊相关系数_皮尔逊相关系数
  13. e站app里站hosts_硬核干货区 | E站的国际站运营知识星球上线啦
  14. css 设置打印a4,CSS设置A4纸大小。
  15. 客户端设置超时,max_fails失效----问题分析
  16. Docker 删除image
  17. Python的len函数探究
  18. 如何判断Hadoop集群是否搭建成功
  19. 易语言误报优化助手 v1.5
  20. STM32H7外设配置速查【QSPI部分】

热门文章

  1. 蓝牙耳机怎么选?蓝牙耳机品牌排行榜
  2. 41..大数据之旅——java分布式项目02
  3. Word2003入门动画教程139:自动套用格式(下)
  4. iphone4开发基础教程的技术点总结3
  5. 百家号注册、发文章审核多久,百家号如何赚钱
  6. 《流放之路》著名的成功之路
  7. 美团技术沙龙01 - 58到家服务的订单调度数据分析技术
  8. SDUT Round #9 2020-新春大作战
  9. 软件流程和管理(十):配置管理
  10. install pecl php_PHP安装pecl扩展--通用