一、行转列
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 行转列,列转行的更多相关文章

  1. oracle 行转列、列转行

    最近做数据处理,经常遇到需要行转列.列转行的场景,记录个非常简单实用的oracle  列转行.行转的列方法 1.行转列,基础数据如下 做行转列处理 处理SQL select user_name,max ...

  2. Oracle 多行变一列的方法

    多行变一列的方法有很多,觉得这个第一眼看懂了当时就用的这个办法. 情况是这样的.以下数据前几列是一样的,需要把VAT_VALUE_CHAR 的值放在同一行上. SELECT * FROM ps_vat ...

  3. oracle 行转列 分析函数

    oracle 行转列 首先看一下源数据: 方法一:WM_CONCAT group by 这个方法没有问题. SELECT CODE_TS, WMSYS.WM_CONCAT(S_NUM + || ':' ...

  4. Oracle 多行转多列

    Oracle 多行转多列,列值转为列名   前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要到处问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的 ...

  5. SQL Server 行转列,列转行。多行转成一列

    一.多行转成一列(并以","隔开) 表名:A 表数据: 想要的查询结果: 查询语句: SELECT name , value = ( STUFF(( SELECT ',' + va ...

  6. ORACLE行转列通用过程

    create or replace procedure row_to_col(tabname in varchar2,                                   group_ ...

  7. Oracle 中的伪列

    昨天做了一个Oracle PL/SQL 相关的测试,其中有一道这样的题目:   下列那些是Oracle的伪列(ACD)  A.ROWID   B.ROW_NUMBER()  C.LEVEL  D.RO ...

  8. 如何获取ResultSet的行数和列数

    当我们执行数据库查询返回一个ResultSet的时候,很多情况下我们需要知道这个ResultSet的大小,即它的行数和列数.我们知道它的列数可以通过resultSet.getMetaData().ge ...

  9. 根据oracle的主键列生成SQLserver的主键

    根据oracle的主键列生成MsSQLServer的主键列 select 'alter table  ' || cu.table_name ||'  add constraint  '||' PK_' ...

  10. MYSQL 多行转多列

    mysql 行变列(多行变成一行/多行合并成一行/多行合并成多列/合并行),我觉得这都是一个意思 数据库结构如图: 而我想让同一个人的不同成绩变成此人在这一行不同列上显示出来,此时分为2中展现: 第一 ...

随机推荐

  1. UUID库

    If you cannot afford to use Boost, then there is a very minimal library that I implemented which sim ...

  2. [BZOJ1014][JSOI2008]火星人prefix

    [BZOJ1014][JSOI2008]火星人prefix 试题描述 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字 ...

  3. Idea 快捷键

    Ctrl+Alt+T 选中代码块加try catch等常用快捷操作.如图: psvm+Tab键 快速创建main方法 pout+Tab键 快速打出System.out.println(); Ctrl+ ...

  4. 树莓派Odroid等卡片式电脑上搭建NAS教程系列6-miniDLNA

    目录: 1. 树莓派Odroid等卡片式电脑上搭建NAS教程系列1-Ubuntu系统安装 2. 树莓派Odroid等卡片式电脑上搭建NAS教程系列2-SSH连接访问 3. 树莓派Odroid等卡片式电 ...

  5. web前端开发培训和自学 哪种选择更适合你

    web前端相对于其他软件开发是比较容易入门的,但是如果深入学习就比较困难了,这门技能需要从业人员掌握一定的设计.代码.交互技能和一些SEO技能,容易入门还涉及这么多知识和技能,那学习web前端开发到底 ...

  6. linux centos yum安装LAMP环境

    centos 6.5 1.yum安装和源代码编译在使用的时候没啥区别,但是安装的过程就大相径庭了,yum只需要3个命令就可以完成,源代码需要13个包,还得加压编译,步骤很麻烦,而且当做有时候会出错,源 ...

  7. 【WP 8.1开发】自定义(RAW)通知的使用

    继续前面的话题,还是推送通知.上一篇文章中遗留了RAW通知的推送没有给各位演示,特特地留到现在,不为别的,只为这个RAW通知有点意思,玩起来会比较有意思.官方文档将RAW通知译为“原始通知”,这里还是 ...

  8. 0017 Java学习笔记-集合-集合一般:HashSet和HashMap

    几个概念 桶(bucket):hash表里可以存储元素的位置 hash冲突:equals()返回false的不相等对象的hashCode()值相等,意味着一个bucket要放几个元素 容量(capac ...

  9. JVM的GC实现详解

    新生代中的98%对象都是“朝生夕死”的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块比较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor. ...

  10. 【BZOJ】1097: [POI2007]旅游景点atr(spfa+状压dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1097 首先还是我很sb....想到了分层图想不到怎么串起来,,,以为用拓扑序搞转移,,后来感到不行. ...