Oracle 行转列,列转行
一、行转列
1.1、初始测试数据
表结构:TEST_TB_GRADE
Sql代码:
1 create table TEST_TB_GRADE
2 (
3 ID NUMBER(10) not null,
4 USER_NAME VARCHAR2(20 CHAR),
5 COURSE VARCHAR2(20 CHAR),
6 SCORE FLOAT
7 )
初始数据如下图:

1.2、 如果需要实现如下的查询效果图:

这就是最常见的行转列,主要原理是利用decode函数、聚集函数(sum),结合group by分组实现的,具体的sql如下:
Sql代码:
1 select t.user_name,
2 sum(decode(t.course, '语文', score,null)) as CHINESE,
3 sum(decode(t.course, '数学', score,null)) as MATH,
4 sum(decode(t.course, '英语', score,null)) as ENGLISH
5 from test_tb_grade t
6 group by t.user_name
7 order by t.user_name
1.3、延伸
如果要实现对各门功课的不同分数段进行统计,效果图如下:

具体的实现sql如下:
Sql代码:
01 select t2.SCORE_GP,
02 sum(decode(t2.course, '语文', COUNTNUM,null)) as CHINESE,
03 sum(decode(t2.course, '数学', COUNTNUM,null)) as MATH,
04 sum(decode(t2.course, '英语', COUNTNUM,null)) as ENGLISH
05 from (
06 select t.course,
07 case when t.score <60 then '00-60'
08 when t.score >=60 and t.score <80 then '60-80'
09 when t.score >=80 then '80-100' end as SCORE_GP,
10 count(t.score) as COUNTNUM
11 FROM test_tb_grade t
12 group by t.course,
13 case when t.score <60 then '00-60'
14 when t.score >=60 and t.score <80 then '60-80'
15 when t.score >=80 then '80-100' end
16 order by t.course ) t2
17 group by t2.SCORE_GP
18 order by t2.SCORE_GP
二、列转行
1.1、初始测试数据
表结构: TEST_TB_GRADE2
Sql代码:
1 create table TEST_TB_GRADE2
2 (
3 ID NUMBER(10) not null,
4 USER_NAME VARCHAR2(20 CHAR),
5 CN_SCORE FLOAT,
6 MATH_SCORE FLOAT,
7 EN_SCORE FLOAT
8 )
初始数据如下图:

1.2、 如果需要实现如下的查询效果图:

这就是最常见的列转行,主要原理是利用SQL里面的union,具体的sql语句如下:
Sql代码:
1 select user_name, 'CN_SCORE' COURSE , CN_SCORE as SCORE from test_tb_grade2
2 union
3 select user_name, 'MATH_SCORE' COURSE, MATH_SCORE as SCORE from test_tb_grade2
4 union
5 select user_name, 'EN_SCORE' COURSE, EN_SCORE as SCORE from test_tb_grade2
6 order by user_name,COURSE
也可以利用【insert all into ... select】来实现,首先需要先建一个表TEST_TB_GRADE3:
Sql代码:
1 create table TEST_TB_GRADE3
2 (
3 USER_NAME VARCHAR2(20 CHAR),
4 COURSE VARCHAR2(20 CHAR),
5 SCORE FLOAT
6 )
再执行下面的sql:
Sql代码:
1 insert all
2 into test_tb_grade3(USER_NAME,COURSE,SCORE) values(user_name, '语文', CN_SCORE)
3 into test_tb_grade3(USER_NAME,COURSE,SCORE) values(user_name, '数学', MATH_SCORE)
4 into test_tb_grade3(USER_NAME,COURSE,SCORE) values(user_name, '英语', EN_SCORE)
5 select user_name, CN_SCORE, MATH_SCORE, EN_SCORE from test_tb_grade2;
6 commit;
别忘记commit操作,然后再查询TEST_TB_GRADE3,发现表中的数据就是列转成行了。
原文地址:http://www.2cto.com/database/201108/100792.html
Oracle 行转列,列转行的更多相关文章
- oracle 行转列、列转行
最近做数据处理,经常遇到需要行转列.列转行的场景,记录个非常简单实用的oracle 列转行.行转的列方法 1.行转列,基础数据如下 做行转列处理 处理SQL select user_name,max ...
- oracle行转列、列转行、连续日期数字实现方式及mybatis下实现方式
转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9977591.html 九月份复习,十月份考试,十月底一直没法收心,赶在十一初 由于不可抗拒的原因又不得不重新找 ...
- Oracle 行转列pivot 、列转行unpivot 的Sql语句总结
这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_user select id||username str from ap ...
- Oracle 行转列及列转行
参考网址:http://blog.163.com/fushahui_1988@126/blog/static/82879994201192844355174/ 一.多行转一列select id, vn ...
- Oracle 多行变一列的方法
多行变一列的方法有很多,觉得这个第一眼看懂了当时就用的这个办法. 情况是这样的.以下数据前几列是一样的,需要把VAT_VALUE_CHAR 的值放在同一行上. SELECT * FROM ps_vat ...
- oracle 多行转多列查询
oracle 多行转多列查询 ---create table Fruit(id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int);inse ...
- oracle 行转列 分析函数
oracle 行转列 首先看一下源数据: 方法一:WM_CONCAT group by 这个方法没有问题. SELECT CODE_TS, WMSYS.WM_CONCAT(S_NUM + || ':' ...
- Oracle 多行转多列
Oracle 多行转多列,列值转为列名 前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要到处问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的 ...
- SQL Server 行转列,列转行。多行转成一列
一.多行转成一列(并以","隔开) 表名:A 表数据: 想要的查询结果: 查询语句: SELECT name , value = ( STUFF(( SELECT ',' + va ...
- Oracle字符串行拆分成列的三种方式
Oracle字符串行拆分成列的三种方式 --muphy 开发过程中经常会遇到将前台多个值用逗号连接一同传递到后台查询,这个用逗号连接的字符串分隔的每个字符串分别对应Oracle数据库表的不同行. 如下 ...
随机推荐
- SharePoint 2013 – Workflow Manager 1.0 offline download
[http://sharepointdeal.wordpress.com/2013/03/13/sharepoint-2013-workflow-manager-1-0-offline-downloa ...
- 分配给 主机的 Evaluation Mode 许可证已过期。建议升级许可证。
参考文献 http://247its.wordpress.com/2012/04/02/new-build-esxi-5-complaints-licence-has-expired/ http:// ...
- TCP/IP 协议难点之一—— IP分片
1 IP协议简单介绍 就个人而言,网络中,抛开网络安全加密这些,就只单单讨论协议本身,比较难的有三个地方: IP分片与重组 TCP滑动窗口与TCP状态的改变 TCP定时器 其实协议本身根据<TC ...
- iOS block从零开始
iOS block从零开始 在iOS4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调. block的结构 先来一段简单的代码看看: void ...
- js DOM Node类型
DOM(文档对象模型)是针对HTML和XML文档的一个API. DOM可以将任何HTML或XML文档描绘成一个由多层节点构成的.以特定节点为根节点的树形结构.节点分为12种不同的类型,每种类型分别表示 ...
- Team Leader炖完石头汤后干嘛
在万众创业的互联网年代,挖人组建全明星团队过于奢侈.面对水平参差不齐的团队咋办? 命运真是捉弄,半年前在大美团打工时准备做个NABC的教学项目 ,结果自己就被挖到"Competitors 竞 ...
- DevExpress ASPxSplitter ClientSideEvents-PaneExpanded 时间用法
在webform中的devexpress aspxsplitter中套用了jquery-easyui的 tabs id=tt <div id="tt" class=" ...
- Vector和Stack(已过时,不建议使用)
以下内容基于jdk1.7.0_79源码: 什么是Vector和Stack Vector:线程安全的动态数组 Stack:继承Vector,基于动态数组实现的一个线程安全的栈: Vector和Stack ...
- 编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 getLegs(),设置动物名称的方法 setKind(),获得动物名称的方法 getKind(),获得动物数量的方法 getCount()。定义Fish类,是Animal类的子类,统计鱼的数量 co
package com.hanqi.test; public class Animal { private String name; private int legs; private int cou ...
- 【hadoop】——HDFS解压缩实现
转载请注明出处:http://www.cnblogs.com/zhengrunjian/p/4527220.html 所有源码在github上,https://github.com/lastsweet ...