文档章节

oracle sql 行列转换

南栀安
 南栀安
发布于 2017/06/28 18:07
字数 478
阅读 1
收藏 0
点赞 0
评论 0

一.建表语句

 create table kecheng
 (
   id     NUMBER,
    name   VARCHAR2(20),
    course VARCHAR2(20),
    score  NUMBER
  );
  insert into kecheng (id, name, course, score)
  values (1, '张三', '语文', 67);
 insert into kecheng (id, name, course, score)
 values (1, '张三', '数学', 76);
 insert into kecheng (id, name, course, score)
 values (1, '张三', '英语', 43);
 insert into kecheng (id, name, course, score)
 values (1, '张三', '历史', 56);
 insert into kecheng (id, name, course, score)
 values (1, '张三', '化学', 11);
 insert into kecheng (id, name, course, score)
 values (2, '李四', '语文', 54);
 insert into kecheng (id, name, course, score)
 values (2, '李四', '数学', 81);
 insert into kecheng (id, name, course, score)
 values (2, '李四', '英语', 64);
 insert into kecheng (id, name, course, score)
 values (2, '李四', '历史', 93);
 insert into kecheng (id, name, course, score)
 values (2, '李四', '化学', 27);
 insert into kecheng (id, name, course, score)
 values (3, '王五', '语文', 24);
 insert into kecheng (id, name, course, score)
 values (3, '王五', '数学', 25);
 insert into kecheng (id, name, course, score)
 values (3, '王五', '英语', 8);
 insert into kecheng (id, name, course, score)
 values (3, '王五', '历史', 45);
 insert into kecheng (id, name, course, score)
 values (3, '王五', '化学', 1);
 commit;

二、固定行转成列

2.1 decode方法

SELECT id, NAME, 
       SUM(decode(course, '语文', score, 0)) 语文,--这里使用max,min都可以
       SUM(decode(course, '数学', score, 0)) 数学, 
       SUM(decode(course, '英语', score, 0)) 英语,
       SUM(decode(course, '历史', score, 0)) 历史, 
       SUM(decode(course, '化学', score, 0)) 化学
	FROM kecheng
 GROUP BY id, NAME;

 

2.2 case when

SELECT ID,NAME,
MAX(CASE WHEN course='语文' THEN score ELSE 0 END) 语文,
MAX(CASE WHEN course='数学' THEN score ELSE 0 END) 数学,
MAX(CASE WHEN course='英语' THEN score ELSE 0 END) 英语,
MAX(CASE WHEN course='历史' THEN score ELSE 0 END) 历史,
MAX(CASE WHEN course='化学' THEN score ELSE 0 END) 化学
FROM kecheng
GROUP BY ID ,NAME

 

三、动态转换行列

DECLARE
  --存放最终的SQL
  LV_SQL VARCHAR2(3000);
  --存放连接的SQL
  SQL_COMMOND VARCHAR2(3000);
  --定义游标
  CURSOR CUR IS
    SELECT COURSE FROM KECHENG GROUP BY COURSE;
BEGIN
  --定义查询开头
  SQL_COMMOND := 'SELECT NAME ';

  FOR I IN CUR LOOP
    --将结果相连接
    SQL_COMMOND := SQL_COMMOND || ' ,SUM(DECODE(course,''' || I.COURSE ||
                   ''',score,0)) ' || I.COURSE;
    DBMS_OUTPUT.PUT_LINE(SQL_COMMOND);
  END LOOP;
  SQL_COMMOND := SQL_COMMOND || ' from KECHENG group by name';
  LV_SQL      := 'INSERT INTO temp_ss  ' || SQL_COMMOND;
  DBMS_OUTPUT.PUT_LINE(LV_SQL);
  EXECUTE IMMEDIATE LV_SQL;
END;

本文转载自:http://www.cnblogs.com/liunanjava/p/4961923.html

共有 人打赏支持
南栀安
粉丝 1
博文 20
码字总数 5177
作品 0
绍兴
Oracle 行列转换的一道微软面试题

昨天 fannairu 给的一个微软面试题, 写 SQL 来实现功能, 里面涉及到行列转换, 这算是 SQL 里一个比较好玩的功能了, 特将解题的思路记录下来. 题目: 现在一个商品销售表 sale , 表结构如下 想...

sailtseng ⋅ 2012/06/20 ⋅ 0

Oracle 多行合并一行 方法

NOTE:特别声明一下内容转自网络 http://www.ningoo.net/html/2008/howtodostringaggregateon_oracle.html 假如有如下表,其中各个i值对应的行数是不定的 Sql代码 SQL> select * from t; --- ...

黄梦巍 ⋅ 2013/12/09 ⋅ 0

11g中利用listagg函数实现自动拼接INSERT语句

本来今天想继续写另一篇外传,但总是熬这么晚不是个事儿,况且今儿北京又输了,恨铁不成钢,堵得慌。。。 白天工作忙,晚上看娃睡了之后才有一些时间可以随便写一些,总结一下,记录一下,算...

bisal ⋅ 2016/12/29 ⋅ 0

罗海雄:仅仅使用AWR做报告? 性能优化还未入门(含PPT)

AWR相信DBA们都不陌生。Automatic Workload Repository,自动负载信息库,就是Oracle把数据库中比较重要的性能视图里的信息,定期从内存保存到数据库里面。默认情况下,Oracle 会每个一个小时...

技术小能手 ⋅ 05/23 ⋅ 0

oracle 行列转换逻辑

该需求涉及到两个知识点:1、分析函数;2、行列转换。 先讲实现 第一步:建测试表 SQL code ? 1 2 3 4 5 6 7 8 9 10 11 12 13 第二步:对表进行分组,组内编号1,2,3 SQL code ? 1 第三步:...

李狗蛋丶 ⋅ 2016/11/05 ⋅ 0

MySQL DML操作--------实现pivot行转列功能最佳实战

1. 背景   * 由于MySQL 不支持类型Oracle与SQL Server的pivot功能进行行列转换。 2. 表与数据 mysql> select * from t_temp;+---------+-----------+------------+| year | season | orderC......

asd1123509133 ⋅ 2017/07/21 ⋅ 0

Oracle 行列转换

行列转换包括以下六种情况:   1. 列转行   2. 行转列   3. 多列转换成字符串   4. 多行转换成字符串   5. 字符串转换成多列   6. 字符串转换成多行 首先声明,有些例子需要如下...

冰Jet ⋅ 2014/08/22 ⋅ 0

一条sql的行列转换,求前辈搭手

sql如下: select dt as day, from left join left join (select day,channel,sum(accountCount) as ll from t14_AccountLoginCount group by dt; 结果集如下: 现在想把行列做转换,期望做成......

想飞 ⋅ 2012/08/29 ⋅ 19

SQL语句行列转换两种方法 case ...when 和pivot函数应用

SQL语句行列转换两种方法 case ...when 和pivot函数应用SQL语句行列转换两种方法 case ...when 和pivot函数应用,运用pivot 函数只支持数据库版本2005以上的。一般运用case when else end 的...

liangjw0504 ⋅ 2013/08/10 ⋅ 7

Oracle 行列转换 总结 (转)

行列转换包括以下六种情况:   1. 列转行   2. 行转列   3. 多列转换成字符串   4. 多行转换成字符串   5. 字符串转换成多列   6. 字符串转换成多行 首先声明,有些例子需要如下...

茄克闹 ⋅ 2015/02/03 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

vim编辑模式、命令模式

编辑模式 vim要从一般模式进入编辑模式只要按字母 i 、I、a、A、o、O键就可以了 要从编辑模式回到一般模式按键盘上的Esc键即可。 按键 作用 i 在当前字符前插入 I 在光标所在行的行首插入 o ...

黄昏残影 ⋅ 26分钟前 ⋅ 0

OSChina 周五乱弹 —— 如果有一天不当程序员了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @guanglun :分享off的单曲《我唱情歌给你听》 《我唱情歌给你听》- off 手机党少年们想听歌,请使劲儿戳(这里) @小小编辑 :#如果不做程序...

小小编辑 ⋅ 33分钟前 ⋅ 4

从 Confluence 5.3 及其早期版本中恢复空间

如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话。你可以使用临时的 Confluence 空间安装,然后将这个 Confluence 安装实例升级到你现...

honeymose ⋅ 今天 ⋅ 0

Java8新增的DateTimeFormatter与SimpleDateFormat的区别

两者最大的区别是,Java8的DateTimeFormatter也是线程安全的,而SimpleDateFormat并不是线程安全。 在并发环境下使用SimpleDateFormat 为了能够在多线程环境下使用SimpleDateFormat,有这三种...

人觉非常君 ⋅ 今天 ⋅ 0

多线程如何控制执行顺序

线程的生命周期说明: 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、...

MarinJ_Shao ⋅ 今天 ⋅ 0

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Django第一期

安装Django 去https://www.djangoproject.com/download/ 下载最新版的Django,然后解压放到Anaconda\Lib\site-packages目录下,然后cmd进入此目录,输入安装命令: python setup.py install ...

大不了敲一辈子代码 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部