文档章节

Oracle行转列操作

o
 osc_bkdv2it5
发布于 2019/08/19 15:01
字数 998
阅读 0
收藏 0

精选30+云产品,助力企业轻松上云!>>>

有时候我们在展示表中数据的时候,需要将行转为列来显示,如以下形式:

原表结构展示如下:
---------------------------
产品名称    销售额     季度
---------------------------
奶酪          50     第一季度
奶酪          60     第二季度
啤酒          50     第二季度
啤酒          80     第四季度
---------------------------

现在需要将上面的原表结构转换为如下所示的结构形式来展示:
--------------------------------------------------------------------------
产品名称   第一季度销售额   第二季度销售额   第三季度销售额   第四季度销售额
--------------------------------------------------------------------------
奶酪      50        60               0                0
啤酒      0        50               0                80
--------------------------------------------------------------------------

一、创建销售表sale_hst表结构

复制代码
--创建销售表
create table sale_hst
(
    prdt_name varchar2(10),--产品名称
    sale_amt number(8),--销售额
    season varchar2(10)--季度
);
复制代码

二、插入基础数据

--插入如上所示的基础数据
insert into sale_hst values ('奶酪',50,'第一季度');
insert into sale_hst values ('奶酪',60,'第二季度');
insert into sale_hst values ('啤酒',50,'第二季度');
insert into sale_hst values ('啤酒',80,'第四季度');

三、使用SQL语句转换

方案1:使用case...when...then...else...end...语句

复制代码
--方案1:使用case...when...then...else...end...语句
select
    prdt_name,
    sum(case when season='第一季度' then sale_amt else 0 end) 第一季度销售额,
    sum(case when season='第二季度' then sale_amt else 0 end) 第二季度销售额,
    sum(case when season='第三季度' then sale_amt else 0 end) 第三季度销售额,
    sum(case when season='第四季度' then sale_amt else 0 end) 第四季度销售额
from sale_hst
group by prdt_name;
复制代码

方案2:Oracle下可以用decode函数处理

说明:

Oracle下可以用decode函数处理:
decode函数是Oracle PL/SQL中功能强大的函数之一,目前还只有Oracle公司的SQL提供了此函数,其他数据库厂商的SQL实现还没有此功能。

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

复制代码
--方案2:Oracle下可以用decode函数处理
select
    prdt_name,
    sum(decode(season,'第一季度',sale_amt,0)) as 第一季度销售额,
    sum(decode(season,'第二季度',sale_amt,0)) as 第二季度销售额,
    sum(decode(season,'第三季度',sale_amt,0)) as 第三季度销售额,
    sum(decode(season,'第四季度',sale_amt,0)) as 第四季度销售额
from sale_hst
group by prdt_name;
复制代码

有时候我们又有如下的需求:

原表的数据形式展示如下:

shopping表:
----------------------------------
u_id       goods            num
----------------------------------
1           苹果               2
2           梨子               5
1           西瓜               4
3           葡萄               1
3           香蕉               1
1           橘子               3
----------------------------------

转换为如下的形式1展示:

--------------------------------------------
u_id          goods_sum    total_num
--------------------------------------------
1             苹果,西瓜,橘子      9
2             梨子           5
3             葡萄,香蕉         2
--------------------------------------------

转换为如下的形式2展示:
------------------------------------------------------
u_id          goods_sum          total_num
------------------------------------------------------
1             苹果(2斤),西瓜(4斤),橘子(3斤)    9
2             梨子(5斤)              5
3             葡萄(1斤),香蕉(1斤)         2
------------------------------------------------------

一、创建购物表shopping表结构

复制代码
--创建购物表shopping
create table shopping
(
    u_id number(10),
    goods varchar2(8),
    num number(10)   
);
复制代码

 二、插入基础数据

复制代码
--插入如上所示的基础数据
insert into shopping values (1,'苹果',2);
insert into shopping values (2,'梨子',5);
insert into shopping values (1,'西瓜',4);
insert into shopping values (3,'葡萄',1);
insert into shopping values (3,'香蕉',1);
insert into shopping values (1,'橘子',3);
复制代码

三、使用SQL语句转换

形式1:

--形式1的语句
select u_id, wmsys.wm_concat(goods) goods_sum,sum(num) total_num  from shopping   group by u_id;

形式2:

--形式2的语句
select u_id, wmsys.wm_concat(goods || '(' || num || '斤)' ) goods_sum,sum(num) total_num  from shopping  group by u_id;

说明:

Oracle中wm_concat(column)函数的使用:
wmsys用户的wm_concate函数
Oracle数据库中,使用wm_concat(column)函数,可以进行字段合并,Oracle中的wmsys.wm_concat主要实现行转列功能(说白了就是将查询的某一列值使用逗号进行隔开拼接,成为一条数据)。wmsys.wm_concat除了单独使用外还可以和over函数结合使用。

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Oracle 行转列pivot 、列转行unpivot 的Sql语句总结

转自:http://blog.csdn.net/xiaokui_wingfly/article/details/42419207 多行转字符串 这个比较简单,用||或concat函数可以实现 实际上就是拆分字符串的问题,可以使用 substr、instr、regex...

Amui
2016/06/29
889
0
Oracle查询如何才能行转列?-sunziren

  原创文章,转载务必注明出处。   今天工作的时候,碰到一个问题,涉及oracle行转列,用了半小时解决,因此在这里写个博客记录一下解决办法。   原数据库表的数据是:      想要达...

osc_6ruay563
01/14
2
0
百度数据开发面试题

事后HR回邮件被刷,总结下面试经历。 面试比较全面,主要是oracle的sql开发,博主傻傻的把数据结构和各种算法看了一上午,下午去完全没问。 话说面试大叔记忆力真的好,啥都记得清清楚楚的。...

osc_tuutsk8t
2018/06/25
3
0
oracle常规使用(一)

[TOC] oracle和mysql目前数据库中的巨头,之前公司一直使用的是mysql,今年对oracle有了初步的接触,简单介绍使用过程中的一些总结 特殊sql distinct 通过distinct关键字针对字段去重。 正常后面...

osc_e4uven7h
2018/08/31
0
0
Oracle:Pivot 行转列(一行中多个字段转成多列)、转行unpivot 的Sql语句总结

原文链接:Oracle:Pivot 和 Unpivot 转多列并包含多个名称 使用格式: 聚合函数(sum,max,avg等),可以支持一或多个,但是需要使用别名(列:sum(t1.x1) a,sum(t1.x2) b) 行转列的条件列...

她的名字叫雨涵
06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux系统检查用户账户到期时间

如果你在 Linux 上启用了密码策略。密码必须在到期前进行更改,并且登录到系统时会收到通知。如果你很少使用自己的帐户,那么可能由于密码过期而被锁定。在许多情况下,这可能会在无需密码登...

老孟的Linux私房菜
51分钟前
17
0
关于南京哪里有开餐饮费发票?

关于南京哪里有开餐饮费发票?聚焦餐饮行业,谈话〖18 7一電一7 5 3 8一徴一3331〗研究院昨发布数据显示,今年上半年,全国餐饮行业招聘需求增长46.18%,平均月薪6387元.随着餐饮行业的快速...

点击fojewio
今天
7
0
android studio 4.0 打开DDMS

1、先找到AndroidStudio配置的SDK路径; 2、在SDK的/tools/路径下有个monitor.bat 的批处理文件; 3、鼠标连续点击两下monitor.bat这个批处理文件,在屏幕上会打开一个类似CMD的命令行中输入...

chenhongjiang
今天
10
0
如何在Android中使用SharedPreferences来存储,获取和编辑值

问题: Closed . 已关闭 。 This question needs to be more focused. 这个问题需要更加集中。 It is not currently accepting answers. 它当前不接受答案。 Learn more . 了解更多 。 Want...

fyin1314
今天
6
0
【JDK1.8】LinkedList源码分析

LinkedList的特性 LinkedList内部使用双向链表作为存储结构,LinkedList可以理解为链表的扩展对象,封装了常用的和非常用的操作链表的方法。以及在通过索引获取元素时的简单优化,通常Linke...

XuePeng77
今天
40
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部