Oracle行转列操作

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

原表结构展示如下:
---------------------------
产品名称    销售额     季度
---------------------------
奶酪          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函数结合使用。

时间: 2024-08-08 16:34:05

Oracle行转列操作的相关文章

oracle 行转列 分析函数

oracle 行转列 首先看一下源数据: 方法一:WM_CONCAT group by 这个方法没有问题. SELECT CODE_TS, WMSYS.WM_CONCAT(S_NUM + 1 || ':' || ELEMENT) ELEMENT FROM T_MERCH_ELEMENT where code_ts='020745' group by CODE_TS; 得到的结果: 上面大家可能会发现序号没有按顺序排列下来.如果没有要求,就这样就可以了.如果要排序看方法二. 方法二:WM_CONC

oracle行转列

针对oracle数据查询的数据,行转列 1.wm_concat函数: 例一: select c1,c2,wm_concat(c3) from T where.... group by c1,c2 查询结果自动用","分割 例二: select c1,c2,wm_concat(c3)over(partition by ..order by..) from T where.... 其中,partition用来分组, order用来排序 2.sys_connect_by_path函数: 这个

ORACLE 行转列的通用过程

--测试数据create table rowtocol_test asselect 2009 year,1 month,'部门1' dept,50000 expenditure from dualunion all select 2009,2,'部门1',20000 from dualunion all select 2009,2,'部门1',30000 from dualunion all select 2010,1,'部门1',35000 from dualunion all select

Oracle行转列、列转行的Sql语句总结(转)

多行转字符串 这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_userselect id||username str from app_user 字符串转多列 实际上就是拆分字符串的问题,可以使用 substr.instr.regexp_substr函数方式 字符串转多行 使用union all函数等方式 wm_concat函数 首先让我们来看看这个神奇的函数wm_concat(列名),该函数可以把列值以",&quo

偶遇Oracle行转列

行转列应该是数据库比较常见的操作了,在oracle中可以使用pivot.decode,可以参考呆瓜的blog: http://blog.csdn.net/ch7543658/article/details/41146809 SELECT name, MAX(DECODE(course, 'java', gread)) AS java, MAX(DECODE(course, 'c#', gread)) AS c#, MAX(DECODE(course, 'c', gread)) AS c, MAX

Oracle行转列、列转行的Sql语句总结

多行转字符串 这个比较简单,用||或concat函数可以实现 ?SQL Code? 12 ? select?concat(id,username)?str?from?app_userselect?id||username?str?from?app_user 字符串转多列 实际上就是拆分字符串的问题,可以使用 substr.instr.regexp_substr函数方式 字符串转多行 使用union all函数等方式 wm_concat函数 首先让我们来看看这个神奇的函数wm_concat(列名)

Oracle行转列和列转行

一.行转列1.1.初始测试数据 表结构:TEST_TB_GRADE Sql代码: 1    create table TEST_TB_GRADE2    (3      ID        NUMBER(10) not null,4      USER_NAME VARCHAR2(20 CHAR),5      COURSE    VARCHAR2(20 CHAR),6      SCORE     FLOAT7    ) 初始数据如下图: 1.2. 如果需要实现如下的查询效果图: 这就是最常见

oracle 行转列、列转行

最近做数据处理,经常遇到需要行转列.列转行的场景,记录个非常简单实用的oracle  列转行.行转的列方法 1.行转列,基础数据如下 做行转列处理 处理SQL select user_name,max(date_201501) as date_201501,max(date_201502),max(date_201503),max(date_201504) from (select t.user_name,case when t.acct_date = '201501' then t.flow

oracle行转列与列转行

一.行转列 在有些应用场景中,如学生成绩.学生所有科目的成绩都保存到一张表里面,当我们需要以列表的形式显示出学生所对应的每一科目的成绩的时候,需要使用到行转列. 示例 1 -- 学生成绩表 2 create table grade ( 3 id varchar2(64) not null, 4 name varchar2(20) not null, 5 course varchar2(100) not null, 6 score number(3) not null, 7 primary key