设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 百科 > 正文

Oracle行转列操作

发布时间:2020-12-30 11:03 所属栏目:128 来源:网络整理
导读:有时候我们在展示表中数据的时候,需要将行转为列来显示,如以下形式: 原表结构展示如下: --------------------------- 产品名称??? 销售额???? 季度 --------------------------- 奶酪????????? 50???? 第一季度 奶酪????????? 60???? 第二季度 啤酒?????

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

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

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

一、创建销售表sale_hst表结构

Oracle行转列操作

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

Oracle行转列操作

二、插入基础数据

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

三、使用SQL语句转换

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

Oracle行转列操作

--方案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;

Oracle行转列操作

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

说明:

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

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

Oracle行转列操作

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

Oracle行转列操作

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

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

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表结构

Oracle行转列操作

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

Oracle行转列操作

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读