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数据库表的不同行. 如下 ...
随机推荐
- 如何编写Vault插件扩展Vault Explorer的功能
今天练习了一下Vault Explorer的扩展程序,基本上是Vault SDK中的HelloWord示例程序.如果你刚刚开始接触Vault的二次开发,希望对你有帮助. 开始之前,你需要安装Vault ...
- Android压力测试工具——Monkey
Android压力测试工具——Monkey Monkey是运行在模拟器上和真机设备上的一段程序,它会产生用户事件的一系列伪随机流,比如点击.触摸.手势,还有很多系统级别的事件.Monkey通常是用来做 ...
- CocoaPods常用终端命令及Profile文件简单介绍
Pod常用终端命令 pod init 创建pod文件 pod install 开始安装第三方框架,如果网上有更新,会安装最新的 pod install --verbose--no-repo-updat ...
- Git 分支管理策略
分支管理策略 下面我们来说一下一般企业中开发一个项目的分支策略: 主分支 master 开发分支 develop 功能分支 feature 预发布分支 release bug 分支 fixbug 其 ...
- 干货之UICollectionViewFlowLayout自定义排序和拖拽手势
使用UICollectionView,需要使用UICollectionViewLayout控制UICollectionViewCell布局,虽然UICollectionViewLayout提供了高度自 ...
- Android实现欢迎界面,点击进入应用
在主线程中开启一个新线程,每隔100ms检查一下时间是否到达自己预设的显示时间,到达则进入应用 实现屏幕的触摸事件,当触摸的时候,进入应用 package com.example.administra ...
- Android IPC机制之AIDL
什么是AIDL AIDL:Android Interface Definition Language,即Android接口定义语言. Android系统中的进程之间不能共享内存,因此,需要提供一些机制 ...
- XMLA连接器--免费但不开源通过ODBO、XMLA
XMLA 连接器(驱动) :来自ARQUERY http://jaist.dl.sourceforge.net/project/xmlaconnect/XMLA_Provider_v1.0.0.1 ...
- ajax页面加载进度条插件
下面两个都是youtube视频的加载进度条效果的ajax插件 一.官网:http://ricostacruz.com/nprogress/官网 github:https://github.com/rs ...
- 2014.1.23 Discuz论坛迁移+VPS配置手记
虽说这也不是我第一次转移这个论坛了,但毕竟还是第一次自己配置VPS,写点东西记一下 一:关于VPS的配置 1.用TeamViewer连接服务器 这个VPS的IDC自己带有一个远程控制的页面,用浏览器打 ...