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函数结合使用。
Oracle行转列操作的更多相关文章
- oracle 行转列 分析函数
oracle 行转列 首先看一下源数据: 方法一:WM_CONCAT group by 这个方法没有问题. SELECT CODE_TS, WMSYS.WM_CONCAT(S_NUM + || ':' ...
- Oracle 行转列pivot 、列转行unpivot 的Sql语句总结
这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str from ap ...
- ORACLE行转列通用过程
create or replace procedure row_to_col(tabname in varchar2, group_ ...
- 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 ...
- ORACLE 行转列的通用过程
--测试数据create table rowtocol_test asselect 2009 year,1 month,'部门1' dept,50000 expenditure from dualun ...
- Oracle行转列、列转行的Sql语句总结
多行转字符串 这个比较简单,用||或concat函数可以实现 SQL Code 12 select concat(id,username) str from app_userselect i ...
- Oracle行转列、列转行的Sql语句总结(转)
多行转字符串 这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_userselect id||username str f ...
- oracle行转列函数WMSYS.WM_CONCAT 用法
1.通过 10g 所提供的 WMSYS.WM_CONCAT 函数即可以完成 行转列的效果 select group_code, wm_concat(display_title) from DR_OPM ...
- Oracle 行转列 动态出转换的列
本文链接:https://blog.csdn.net/Huay_Li/article/details/82924443 10月的第二天,前天写了个Oracle中行转列的pivot的基本使用方法,然后, ...
随机推荐
- A - 迷宫问题
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Pra ...
- C#编程语言与面向对象—— 多态
多态编程的基本原理是: 使用基类或接口变量编程. 在多态编程中,基类一般都是抽象类,其中拥有一个或多个抽象方法,各个子类可以根据需要重写这些方法.或者使用接口,每个接口都规定了一个或多个抽象方法,实现 ...
- MSP430单片机的两种SPI总线实现方式
MSP430单片机上的SPI总线的实现方式分为两种:硬件实现和软件实现. 二者的抽象层次不同,硬件实现方式下程序员只需要完成总线协议的寄存器层,即一字节(char,8位二进制)数据,而软件实现方式下程 ...
- bootstrap-14
基础导航条: 使用方法:1. 首先在制作导航的列表(<ul class="nav">)基础上添加类名"navbar-nav" 2.在列表外部添加一个 ...
- 详解java方法的重载
1.方法的重载: 方法名相同,参数列表不同就叫做方法的重载.
- 个人项目(JUnit单元测试)
---恢复内容开始--- 一. 题目简介 这次的单元测试我选择作了一个基本运算的程序,该程序实现了加,减,乘,除,平方,倒数的运算,该程序进行测试比较的简单,对于初步接触JUn ...
- Map练习错误
private Student findStuByNumber(String number) { Student student=null ; for(Stude ...
- jdb调试命令
常用调试命令: run GeoHashTest #带参数运行 stop at GeoHashTest:22 #断点GeoHashTest文件的22行 stop in GeoHashEncode.Enc ...
- 为什么有禁用Mac系统的Spotlight的需求:
一.为什么有禁用Mac系统的Spotlight的需求: 有的网友由于使用的是相对较老的苹果电脑在运行较新的系统:也有可能你是个速度控,受不了偶尔卡卡顿顿的操作,必须将所有导致卡顿的原因全部消除:也有可 ...
- 高级Linux SA需要会做的事情
高级Linux SA需要会做的事情:linux---------系统安装(光盘或自动化安装)linux---------系统常用工具安装(sudo,ntp,yum,rsync,lrzsz syssta ...