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

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

Oracle行转列操作的更多相关文章

  1. oracle 行转列 分析函数

    oracle 行转列 首先看一下源数据: 方法一:WM_CONCAT group by 这个方法没有问题. SELECT CODE_TS, WMSYS.WM_CONCAT(S_NUM + || ':' ...

  2. Oracle 行转列pivot 、列转行unpivot 的Sql语句总结

    这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str from ap ...

  3. ORACLE行转列通用过程

    create or replace procedure row_to_col(tabname in varchar2,                                   group_ ...

  4. ORACLE行转列通用过程(转)

    1.使用视图 SQL code? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 create or r ...

  5. ORACLE 行转列的通用过程

    --测试数据create table rowtocol_test asselect 2009 year,1 month,'部门1' dept,50000 expenditure from dualun ...

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

    多行转字符串 这个比较简单,用||或concat函数可以实现  SQL Code  12    select concat(id,username) str from app_userselect i ...

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

    多行转字符串 这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_userselect id||username str f ...

  8. oracle行转列函数WMSYS.WM_CONCAT 用法

    1.通过 10g 所提供的 WMSYS.WM_CONCAT 函数即可以完成 行转列的效果 select group_code, wm_concat(display_title) from DR_OPM ...

  9. Oracle 行转列 动态出转换的列

    本文链接:https://blog.csdn.net/Huay_Li/article/details/82924443 10月的第二天,前天写了个Oracle中行转列的pivot的基本使用方法,然后, ...

随机推荐

  1. CSharper~

    昨天晚上开始,重启读clr via c#大计.Jeffery大神的大作基本上没人不推荐的,所以我也抱了很大的期待,希望读完以后对.net的认识能有质的飞跃.争取五月份内读完.昨天看完了第一章,感觉.n ...

  2. 托管到github上的网页图片在百度浏览器中显示不全

    这几天做了个较完整的网页放到github上,上传后看网页效果. 在Firefox浏览器中,显示正常. 在百度浏览器中,空了一大块位置(图片位置),偏偏只空了这一块,其它地方的图片都好好的. 点击f12 ...

  3. include/asm/dma.h

    /* $Id: dma.h,v 1.7 1992/12/14 00:29:34 root Exp root $ * linux/include/asm/dma.h: Defines for using ...

  4. 初识Linux-2

    1,rm leo/a*可以将leo文件夹中带有a的所有的文件都删除,rm-r leo/a*可以将文件夹中含有a的文件和文件夹都全部删除 2,ls -l -d dc/*2表示遇到含有2的目录时不进入目录 ...

  5. LINUX中如何查看某个进程打开的网络链接有多少

    使用lsof命令,比如查看sshd这个程序的网络连接使用命令 lsof -i | grep ^sshd

  6. tomcat从 http转成https,并且去掉端口号

    将 <Connector port=" URIEncoding="UTF-8"/> 改成 <Connector port=" URIEncod ...

  7. 042. asp.net使用缓存来提高母版页的访问性能

    Asp.Net缓存技术是一项非常重要的技术, 当一个页面被频繁的访问, 如果不使用缓存技术, 那么每访问一次就要回发一次服务器, 显然这样对服务器造成很大的负担, 所以, 可以在被频繁访问的页面中设置 ...

  8. 分析案例:界面提示“基础链接已经关闭:接收时发生错误”----本质为StackOverflow

    问题描述: 一个业务复杂.执行时间很长的功能,经常报出“基础链接已经关闭:接收时发生错误”,很是蹊跷... 问题分析: 首先,查阅应用服务器的系统日志,发现问题发生时总是会伴随着w3wp进程崩溃的错误 ...

  9. [nginx] connect() failed (111: Connection refused) while connecting to upstream, client: 101.18.123.107, server: localhost,

    nginx一直报错, 2016/12/02 10:23:19 [error] 1472#0: *31 connect() failed (111: Connection refused)while c ...

  10. [转]Windows 下的进程间通讯及数据共享

    http://blog.codingnow.com/2005/10/interprocess_communications.html Windows 下有很多方法实现进程间通讯,比如用 socket, ...