文档章节

oracle sql 行列转换

南栀安
 南栀安
发布于 2017/06/28 18:07
字数 478
阅读 2
收藏 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学习之路-- 案例分析实现行列转换的几种方式

注:本文使用的数据库表为oracle自带scott用户下的emp,dept等表结构.     通过一个例子来说明行列转换: 需求:查询每个部门中各个职位的总工资     按我们最原始的思路可能会这么写:  ...

冬至饮雪
2016/07/11
0
0
Oracle 行列转换的一道微软面试题

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

sailtseng
2012/06/20
0
0
PostgreSQL Oracle 兼容性 - 行列变换(pivot unpivot) (tablefunc, crosstab)

标签 PostgreSQL , Oracle , 行列变换 , pivot , unpivot , tablefunc , crosstab , json , jsonb 背景 行列转换是OLAP应用场景中,对数据透视常用的SQL之一。 Oracle pivot 行转列 语法如下...

德哥
10/05
0
0
11g中利用listagg函数实现自动拼接INSERT语句

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

bisal
2016/12/29
0
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
2
0

没有更多内容

加载失败,请刷新页面

加载更多

1个开发如何撑起一个过亿用户的小程序

本文由云+社区发表 2018年12月,腾讯相册累计用户量突破1亿,月活1200万,阿拉丁指数排行 Top 30,已经成为小程序生态的重量级玩家。 三个多月来,腾讯相册围绕【在微信分享相册照片】这一核...

腾讯云加社区
3分钟前
0
0
golang ssh包使用方法介绍

在使用gexpect包发现很多问题之外,这里又尝试使用ssh user@127.0.0.1的思路进行用户切换。这里记录下具体的使用方法,遇到的ssh: must specify HostKeyCallback 问题的解法方法及最终使用过...

linuxprobe16
8分钟前
0
0
layer

Layui Layer在open弹出层中异步加载数据和form表单radio、checkbox、select不渲染,不可点击的解决办法 layer 实现弹窗提交信息 function confirmUpdateAward(i) { layer.open({ ...

mickelfeng
57分钟前
0
0
Spring boot中如何获取profiles环境

  实现ApplicationContextAware @Componentpublic class QiNiuPropertiesConfig implements ApplicationContextAware { /// 获取当前环境public String getActiveProfile() { ret......

writeademo
今天
3
0
机器学习中的End-to-End到底是怎么回事?

简单讲就是,Input--->系统(这里指神经网络)--->Output(直接给出输入,NN神经网络就给出结果,一气喝成!!!) 借用一段对话:(http://dy.163.com/v2/article/detail/C3J6F2NJ0511AQHO....

火力全開
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部