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的基本使用方法,然后, ...
随机推荐
- LaTeX_fleqn参数时,多行公式对齐居中的同时选择性的加编号
[转载请注明出处]http://www.cnblogs.com/mashiqi 2016/10/20 一年多没写博文了.今天写一个短的,记录一下使用LaTeX的一些经验. 有些时候,我们的latex文 ...
- iOS 崩溃日志 Backtrace的符号化
iOS的崩溃日志配合dsym文件可以找到崩溃时的backtrace,这是解决崩溃的最重要的信息. 如果是在同一台mac上打包, 导入crash log时候会自动将backtrace符号化,可以看到方法 ...
- seo查询命令
以下内容均来自网络,只是稍微整理 感觉比较好用的是1.2.5.6.11.12.13条 1. site指令: 查询某个特定网站收录情况. 比如查询6676小游戏收录格式即为:site:www.6676. ...
- angular2-aot-webpack 生产环境下编译angular2
这里讲讲,angular2在生产模式下用webpack2进行打包的方法: //使用rollup打包还是比较坑的,功能及插件上都不如webpack, 关键不支持代码分离,导致angular里的lazy ...
- rigidbody2D.velocity 提示缺少using?用的unity5?
请用 GetComponent<Rigidbody2D>().velocity
- linux常用工具集合
网络: nm-tool 查看网络状态(有线/无线)
- pyqt4:线程的串联运行方式
有些时候我们在pyqt中需要线程串行运行,而不是并发运行,用以下方式,这是在网上找的,暂存. > Hello > I have something like the foll scenar ...
- win10 localhost 解析为 ipv6地址 ::1 的解决办法
今天遇到个奇怪的问题,localhost 访问时提示 not found 404,但是有127.0.0.1可以访问.最后找到原因,是因为 windows 把 localhost 解析为 ipv6 地址 ...
- 【转】Java出现No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing
最近在看Java,在编译写书上一个例子时,由于书上的代码只有一部分,于是就自己补了一个内部类.结果编译时出现:No enclosing instance of type E is accessible ...
- u-boot-2010.09移植(A)
第一阶段 1.开发环境 系统:centOS6.5 linux版本:2.6.32 交叉编译器:buildroot-2012.08 以上工具已经准备好,具体安装步骤不再 ...