oracle 行专列
首先,做准备工作.
建表
-- Create table
create table DEMO
(
n_iden NUMBER,
c_order_code NVARCHAR2(50),
c_order_name NVARCHAR2(50),
c_friut NVARCHAR2(50),
c_amount NUMBER(20,4),
d_build DATE,
c_buyer NVARCHAR2(50),
c_seller NVARCHAR2(50)
)
tablespace MYORCL1
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
-- Add comments to the columns
comment on column DEMO.n_iden
is 'ID';
comment on column DEMO.c_order_code
is '订单号';
comment on column DEMO.c_order_name
is '订单名称';
comment on column DEMO.c_friut
is '水果类型';
comment on column DEMO.c_amount
is '水果数量';
comment on column DEMO.d_build
is '创建日期';
comment on column DEMO.c_buyer
is '订货人';
comment on column DEMO.c_seller
is '买货人';
插入数据:
insert into DEMO (N_IDEN, C_ORDER_CODE, C_ORDER_NAME, C_FRIUT, C_AMOUNT, D_BUILD, C_BUYER, C_SELLER)
values (1, 'order_num1', '第一单', '苹果', 1.0000, to_date('11-01-2017', 'dd-mm-yyyy'), null, null); insert into DEMO (N_IDEN, C_ORDER_CODE, C_ORDER_NAME, C_FRIUT, C_AMOUNT, D_BUILD, C_BUYER, C_SELLER)
values (2, 'order_num1', '第一单', '橘子', 2.0000, to_date('11-01-2017', 'dd-mm-yyyy'), null, null); insert into DEMO (N_IDEN, C_ORDER_CODE, C_ORDER_NAME, C_FRIUT, C_AMOUNT, D_BUILD, C_BUYER, C_SELLER)
values (3, 'order_num1', '第一单', '香蕉', 3.0000, to_date('11-01-2017', 'dd-mm-yyyy'), null, null); insert into DEMO (N_IDEN, C_ORDER_CODE, C_ORDER_NAME, C_FRIUT, C_AMOUNT, D_BUILD, C_BUYER, C_SELLER)
values (4, 'order_num2', '第二单', '苹果', 4.0000, to_date('10-01-2017', 'dd-mm-yyyy'), null, null); insert into DEMO (N_IDEN, C_ORDER_CODE, C_ORDER_NAME, C_FRIUT, C_AMOUNT, D_BUILD, C_BUYER, C_SELLER)
values (5, 'order_num2', '第二单', '橘子', 5.0000, to_date('10-01-2017', 'dd-mm-yyyy'), null, null);
如果我们要实现以订单名称和订单代码为一个单位的数据时
order_code order_name 苹果 橘子 香蕉
order_num1 第一单 1 2 3
order_num2 第二单 4 5 0
普通的实现方式比较复杂,并且当苹果种类较多的时候会变得极其不适用
普通方法的代码如下
select c_order_code ,c_order_name,sum(decode(c_friut,'苹果',c_amount,0)) 苹果, sum(decode(c_friut,'橘子',c_amount,0)) 橘子, sum(decode(c_friut,'香蕉',c_amount,0)) 香蕉 from DEMO group by c_order_code ,c_order_name
用 PIVOT 函数如下
select * from (
(select c_order_code,c_order_name,c_friut,C_AMOUNT from demo) pivot( sum(C_AMOUNT)for c_friut in ('苹果','橘子','香蕉') )
)
翻译:pivot :轴,中心
sum() :单聚合函数
for:对于,关于
c_friut : 转换为行的字段
in('苹果','橘子','香蕉') : 以三种水果为分组
上述两种的查询结果为:

还有一种行专列的形式,是用 wm_concat函数
select c_order_code,c_order_name, to_char(wm_concat(c_friut)) from demo group by c_order_code,c_order_name;
order_num1 第一单 橘子,苹果,香蕉
通常是配合替换函数使用:
因为作者水平有限,难免有疏漏之处.望读者不吝批评指正!
oracle 行专列的更多相关文章
- 普通的行专列;oracle行专列;更新中。。。
题记 本来想写一个完整的表创建,但是其他人都写过啦,要不这样,你们有什么行转列的问题给我留言,我直接回答如何 Oracle的行转列 这篇文章不错:https://blog.csdn.net/huay_ ...
- ORACLE行转列(行转1列,行转多列)
在oracle 11g release 2 版本中新增的listagg函数,listagg是一个实现字符串聚合的oracle内建函数;listagg(column,'分隔符') within grou ...
- hive:数据库“行专列”操作---使用collect_set/collect_list/collect_all & row_number()over(partition by 分组字段 [order by 排序字段])
方案一:请参考<数据库“行专列”操作---使用row_number()over(partition by 分组字段 [order by 排序字段])>,该方案是sqlserver,orac ...
- Oracle 行转列总结 Case When,Decode,PIVOT 三种方式 - 转
最近又碰到行专列问题了,当时不假思索用的是子查询,做完后我询问面试管行专列标正的写法应该如何写,他告诉我说应该用"Decode",索性我就总结一下,一共三种方式 --======= ...
- sql 行专列 列转行 普通行列转换
转载:http://www.cnblogs.com/newwind521/archive/2010/11/25/1887203.html sql 行专列 列转行 普通行列转换 /* 标题:普通行列转换 ...
- oracle 行转列 分析函数
oracle 行转列 首先看一下源数据: 方法一:WM_CONCAT group by 这个方法没有问题. SELECT CODE_TS, WMSYS.WM_CONCAT(S_NUM + || ':' ...
- 数据库“行专列”操作---使用row_number()over(partition by 分组字段 [order by 排序字段])
测试样例: create table test(rsrp string,rsrq string,tkey string,distan string); '); '); '); '); select * ...
- Oracle 行转列pivot 、列转行unpivot 的Sql语句总结
这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str from ap ...
- oracle行锁select for update
oracle行锁select for update 学习了:https://blog.csdn.net/zdwzzu2006/article/details/50490157 学习了:https:// ...
随机推荐
- 开源中文分词工具探析(三):Ansj
Ansj是由孙健(ansjsun)开源的一个中文分词器,为ICTLAS的Java版本,也采用了Bigram + HMM分词模型(可参考我之前写的文章):在Bigram分词的基础上,识别未登录词,以提高 ...
- GridView Tab/Enter键插入新行
此段代码是从DevExpress官方回复文件中得到的.可以用来优化GridView的操作体验. /// <summary> /// GridView添加新行 /// </summar ...
- js 判断是否为正数
function validate(num) { var reg = /^\d+(?=\.{0,1}\d+$|$)/ if(reg.test(num)) return true; return ...
- [UWP小白日记-10]程序启动屏(ios解锁既视感)
讲一下 微软爸爸的开发者大会2016又暴了个表达式动画和Windows.UI.Composition的API,好叼的样子. 官方示例库GitHub 目前是懵逼状态,好复杂.脑细胞已经在地府排队了. ( ...
- 词典 (noi OpenJudge)
传送门:1806:词典 神奇的STL #include <iostream> #include <cstdio> #include <cstring> #inclu ...
- python学习——DAY1
日期:20170113 一.个人体会: 零基础学python,是艰辛的,需要付出和坚持. 关于流程图.我最开始画的是从上到下,再从左到右,画了很多重复的内容,单线程的流程图,看起来很容易理解,但是自己 ...
- 最简单的MFC
#include <SDKDDKVer.h> #include <afxwin.h> #include <afxext.h> #include <iostre ...
- 面向对象---final关键字
final 在java中表示的意思是最终,也称为完结器,可以用final关键字声明类.属性.方法,在声明时需要注意以下几点: 1.使用final声明的类不能有子类. 2.使用final声明的方法不能被 ...
- Spark编程模型及RDD操作
转载自:http://blog.csdn.net/liuwenbo0920/article/details/45243775 1. Spark中的基本概念 在Spark中,有下面的基本概念.Appli ...
- xml动态修改 dom4j修改
xml的动态修改需要传入的参数 xml的位置(tomcat中的发布位置).修改后的xml需要保存的位置(因为动态修改,所以建议和xml未修改前的位置相同).添加的节点的信息.或者修改的节点的信息 SA ...