精华内容
下载资源
问答
  • ORACLE行转列转行

    千次阅读 2018-11-23 17:44:24
    文章目录ORACLE列和列转行定义ORACLE-行列-unpivot数据...列转行:把一列多行数据转换成一行多列数据 ORACLE-行列-unpivot 数据准备 -- 此表用于表示某人四个季度的收入:用于行列测试 create table t_t...

    ORACLE行转列和列转行

    定义

    • 行转列:把一行多列数据转换成一列多行数据
    • 列转行:把一列多行数据转换成一行多列数据

    ORACLE-行转列-unpivot

    数据准备

    -- 此表用于表示某人四个季度的收入:用于行转列测试
    create table t_test1(
      v_name varchar2(50),-- 姓名
      v_age number,-- 年龄
      q_1 number,-- 第一季度
      q_2 number,-- 第二季度
      q_3 number,-- 第三季度
      q_4 number -- 第四季度
    );
    
    -- 插入数据
    insert all 
    into t_test1
    values ('张三',23,2000,3000,4000,5000)
    into t_test1
    values ('李四',34,3000,4000,5000,6000)
    select 1 from dual;
    
    -- 提交数据
    commit;
    

    行转列使用

    -- 行转列-复杂表述
    select t.* from (-- 加个括号是为了表示括号里是个整体,便于理解
      (
        select 
          v_name,
          v_age,
          q_1,
          q_2,
          q_3,
          q_4
        from t_test1
      )
      unpivot (
        v_value -- 值列
        for v_q in(-- 类型列
          q_1 as '第一季度',-- 加默认值
          q_2 as '第二季度',-- 加默认值
          q_3 as '第三季度',-- 加默认值
          q_4-- 不加默认值
        )
      )
    ) t;
    
    -- 行转列-简单表述
    select * from t_test1
    unpivot (
      v_value -- 值列
      for v_q in(-- 类型列
        q_1 as '第一季度',-- 加默认值
        q_2 as '第二季度',-- 加默认值
        q_3 as '第三季度',-- 加默认值
        q_4-- 不加默认值
      )
    );
    

    ORACLE-列转行-pivot

    数据准备

    -- 此表用于表示某人四个季度的收入:用于列转行测试
    create table t_test2(
      v_name varchar2(50),-- 姓名
      v_age number,-- 年龄
      v_q varchar2(10),-- 季节类型列
      v_value number-- 值列
    );
    
    
    -- 插入数据
    insert all 
    into t_test2
    values ('张三',23,'第一季度',2000) 
    into t_test2
    values ('张三',23,'第二季度',3000) 
    into t_test2
    values ('张三',23,'第三季度',4000) 
    into t_test2
    values ('张三',23,'第四季度',5000) 
    into t_test2
    values ('李四',34,'第一季度',3000)
    into t_test2
    values ('李四',34,'第二季度',4000)
    into t_test2
    values ('李四',34,'第三季度',5000)
    into t_test2
    values ('李四',34,'第四季度',6000)
    select 1 from dual;
    
    -- 提交数据
    commit;
    

    列转行使用

    -- 列转行-复杂表述
    select t.* from(-- 加个括号是为了表示括号里是个整体,便于理解
      (
        select 
          v_name,v_age,-- 这两个字段用于分组,相当于group by,一般只取主键
          v_q,-- 这个字段用于区分列,用于生成不同列
          v_value -- 这个字段用于汇总统计
        from t_test2
      )
      pivot (
        sum(v_value)
        for v_q in (
          '第一季度' as 第一季度,
          '第二季度' q_2,
          '第三季度' as q_3,
          '第四季度'
        )
      )
    ) t;
    
    -- 列转行-简单表述
    select * from t_test2
    pivot(
      sum(v_value) as 后缀
      for v_q in (
        '第一季度' as 第一季度,
        '第二季度' q_2,
        '第三季度' as q_3,
        '第四季度'
      )
    );
    
    展开全文
  • oracle行转列_转行

    2012-11-09 15:11:27
    oracle行转列_转行,实例加解析,自己测试没问题。免费分享了~
  • oracle行转列转行

    万次阅读 2018-05-26 13:17:54
    行转列:PIVOT转行:UNPIVOT这两个是在oracle11g上面新增的函数。下面举例说明用法。PIVOT:学生成绩表,原数据:select class_name, student_name, course_type, result, created_date from class_tmp_2;每个...

    行转列:PIVOT

    列转行:UNPIVOT

    这两个是在oracle11g上面新增的函数。下面举例说明用法。


    PIVOT:

    学生成绩表,原数据:

    select class_name, student_name, course_type, result, created_date
      from class_tmp_2;


    每个同学的两门成绩,是两条数据,因为业务需要,展示给用户看的时候,用户想要每个同学只要一条数据,并且把所有成绩都展示出来,比如

    这个时候就需要用到行专列函数PIVOT.

    SELECT class_name, student_name, 语文, 数学, created_date
      FROM (SELECT CLASS_NAME, STUDENT_NAME, COURSE_TYPE, RESULT, CREATED_DATE
              FROM CLASS_TMP_2) T
    PIVOT(SUM(RESULT)
       FOR COURSE_TYPE IN('语文' AS 语文, '数学' AS 数学));

    浅灰色的sql和上面的原数据sql一样,主要看一下后面的PIVOT部分。

    sum(result):成绩之和(PIVOT内需有聚集函数)

    for course_type in ('语文' as语文, '数学' as数学):将course_type列的字段值转换成列名,其中,字段值是'语文',转换成语文列,字段值是'数学',转换成数学列,这两列的字段值,即前面的sum(result)。

    不用函数也可以得到,如下sql:

    select t1.class_name,
           t1.student_name,
           t1.result       语文,
           t2.result       数学,
           t1.created_date
      from (select a.class_name,
                   a.student_name,
                   a.course_type,
                   a.result,
                   a.created_date
              from class_tmp_2 a
             where a.course_type = '语文') t1,
           (select a.class_name,
                   a.student_name,
                   a.course_type,
                   a.result,
                   a.created_date
              from class_tmp_2 a
             where a.course_type = '数学') t2
     where t1.class_name = t2.class_name
       and t1.student_name = t2.student_name;



    UNPIVOT:列转行

    反过来,原数据如下:


    而我想要得到的结果如下:


    SQL:

    select class_name, student_name, course_type, result, created_date
      from class_tmp 
      unpivot(result for course_type in(chinese_result,math_result));

    原数据的chinese_result列和math_result列的列名(浅灰色),将转换为新建列course_type的字段值,表示课种。

    原数据的chinese_result列和math_result列的字段值,将转换为新建列result的字段值,表示分数。


    展开全文
  • Oracle行转列转行大全

    千次阅读 2019-08-24 21:15:50
    函数wm_concat(列名)介绍:该函数可以把值以","号分隔起来,并显示成一行 准备测试数据: create table test(id number,name varchar2(20)); insert into test values(1,'a'); insert into test values(1,'b');...

    wm_concat函数

    函数wm_concat(列名)介绍:该函数可以把列值以","号分隔起来,并显示成一行

    准备测试数据:

    create table test(id number,name varchar2(20));  
      
    insert into test values(1,'a');  
    insert into test values(1,'b');  
    insert into test values(1,'c');  
    insert into test values(2,'d');  
    insert into test values(2,'e');
    

    效果1 : 行转列,默认逗号隔开

    select wm_concat(name) name from test;
    

    效果2: 把结果里的逗号替换成"|"

    select replace(wm_concat(name),',','|') from test;
    

    效果3: 按ID分组合并name

    select id,wm_concat(name) name from test group by id;
    

    懒人扩展用法

    案例: 我要写一个视图,类似"create or replace view as select 字段1,…字段50 from tablename" ,基表有50多个字段,要是靠手工写太麻烦了,有没有什么简便的方法? 当然有了,看我如果应用wm_concat来让这个需求变简单,假设我的APP_USER表中有(id,username,password,age)4个字段。查询结果如下

    /** 这里的表名默认区分大小写 */  
    select 'create or replace view as select '|| wm_concat(column_name) || ' from APP_USER' sqlStr   
    from user_tab_columns where table_name='APP_USER';
    

    Oracle 11g 行列互换 pivot 和 unpivot 说明

    pivot 列转行

    create table demo(id int,name varchar(20),nums int);  ---- 创建表  
    insert into demo values(1, '苹果', 1000);  
    insert into demo values(2, '苹果', 2000);  
    insert into demo values(3, '苹果', 4000);  
    insert into demo values(4, '橘子', 5000);  
    insert into demo values(5, '橘子', 3000);  
    insert into demo values(6, '葡萄', 3500);  
    insert into demo values(7, '芒果', 4200);  
    insert into demo values(8, '芒果', 5500);
    

    行转列查询

    select * from (select name, nums from demo) pivot (sum(nums) for name in ('苹果' 苹果, '橘子', '葡萄', '芒果'));
    

    注意: pivot(聚合函数 for 列名 in(类型)) ,其中 in(‘’) 中可以指定别名,in中还可以指定子查询,比如 select distinct code from customers

    当然也可以不使用pivot函数,等同于下列语句,只是代码比较长,容易理解

    ------ 多项子查询  
    select * fromselect sum(nums) 苹果 from demo where name='苹果',select sum(nums) 橘子 from demo where name='橘子',select sum(nums) 葡萄 from demo where name='葡萄',select sum(nums) 芒果 from demo where name='芒果';  
             
    ------  decode 函数利用  
    select sum(decode(name,'苹果',nums)) 苹果, sum(decode(name,'橘子',nums)) 橘子,   
           sum(decode(name,'葡萄',nums)) 葡萄, sum(decode(name,'芒果',nums)) 芒果 from demo
    

    unpivot 行转列

    案例:现在有一个水果表,记录了4个季度的销售数量,现在要将每种水果的每个季度的销售情况用多行数据展示。

    创建表和数据

    create table Fruit(id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int);  
      
    insert into Fruit values(1,'苹果',1000,2000,3300,5000);  
    insert into Fruit values(2,'橘子',3000,3000,3200,1500);  
    insert into Fruit values(3,'香蕉',2500,3500,2200,2500);  
    insert into Fruit values(4,'葡萄',1500,2500,1200,3500);  
    select * from Fruit
    

    例子:

    select id , name, jidu, xiaoshou from Fruit unpivot (xiaoshou for jidu in (q1, q2, q3, q4) )
    
    展开全文
  • Oracle行转列次经历

    千次阅读 2018-07-17 14:16:47
    新项目表结构作了调整,每个党员每一年条记录,12个月份的数据变成了字段,主键变成由年份和党员id构成,表结构如下: 月统计得分和季统计得分的数据存储是有格式要求的,如下: 由于需要数据迁移,我把...

    需求如下,由于系统项目改造,之前党员各个月份的成绩如下表所示:

    这里写图片描述
    存取数据如下:
    这里写图片描述

    新项目表结构作了调整,每个党员每一年一条记录,12个月份的数据变成了列字段,主键变成由年份和党员id构成,表结构如下:

    这里写图片描述

    月统计得分和季统计得分的数据存储是有格式要求的,如下:

    展开全文
  • Oracle 行转列

    千次阅读 2021-09-08 18:18:00
    Oracle行转列种方式 建多张表 #1.创建住院诊断表,按照日期分组,按照日期和患者id降序,生成RN字段。 CREATE TABLE PALAN.TZ_ZY_DIAG AS SELECT PATIENT_TYPE, DATE1, DIAG_NAME, PID , ROW_NUMBER() OVER ...
  • oracle行转列

    千次阅读 2018-08-17 15:03:56
    行转列 主要原理是利用decode函数、聚集函数(sum),结合group by分组实现的 decode函数 其具体的语法格式如下: DECODE(input_value,value,result[,value,result…][,default_result]); 其中: input_value ...
  • Oracle 行转列转行

    万次阅读 2016-05-16 18:37:58
    facility列取值只有四种,每种一列,遇到相同facility求和。如下图: 实现方式 DECODE 利用DECODE函数、聚合函数SUM、GROUP BY分组实现。 WITH CO_ORDER AS( SELECT 'DOM1' Customer, 'ZHA01' fa
  • Oracle行转列详解

    万次阅读 2019-07-05 17:16:00
    、建表与插入数据 1.1、建表 create table kecheng (   id     NUMB...
  • Oracle行转列转行的几种方法

    千次阅读 2019-11-08 15:58:46
    行转列 我们的表结构和数据如下: 1、使用PIVOT函数 Oracle 11g之后,支持使用PIVOT实现行转列 函数说明: PIVOT(任意聚合函数 FOR 列名 IN(类型)) 其中,【聚合函数】聚合的字段,是需要转化为...
  • 偶遇Oracle行转列

    千次阅读 2016-05-06 16:58:41
    使用decode实现报表的行转列
  • Oracle行转列

    千次阅读 2019-06-12 11:22:16
    oracle行转列(感觉不该叫这个名字)小记录 、工具 win10、oracle 11g(之前版本不支持pivot函数)、pl/sql Developer 建表语句 create table r2c( name varchar2(30), subject varchar2(20), score number ); ...
  • Oracle 行转列 动态出转换的

    万次阅读 多人点赞 2018-10-02 13:03:23
    10月的第二天,前天写了个Oracle中行转列的pivot的基本使用方法,然后,因为pivot的用法中,正常情况下,我们需要出多少个,都得在我们的sql中完完整整地写出,而不能直接在里面写个查询来动态转换。然后,趁着...
  • Oracle 行转列 pivot函数基本用法

    万次阅读 多人点赞 2018-09-30 23:28:05
    2018年9月30日22点,眼看着就10月份了,回头看下,8月份就写了...所以暂时先写个Oracle自带的行转列函数,pivot的基本用法。国庆几天看下有时间的话完善一下动态转列的做法,到时候再另写篇附链接过来。 、运...
  • oracle 行转列,多行转列

    千次阅读 2018-11-14 10:35:23
    问题描述:  应公司要求,设计功能,个ID,对应不同的值,展示的时候不同的值拼接展示,如何实现;... 2) Oracle 自带的个函数 wm_concat 函数 非常给力; 上代码 --测试表1 create table ceshi1(ID var...
  • 目前很多行转列都使用了 oracle 11g新增的pivot ,但是我用达梦国产数据库不支持该函数,所以使用case when的方式 首先,我们需要构造个两列的数据,也就是查询结果 select 'aaaaa' as flag ,'1' as num from ...
  • oracle 多行转一列,一列转多行

    万次阅读 2015-06-12 17:07:31
    有一个表,表名为tab_test,如下: 一、多行转一列 select id, vnum, to_char(wmsys.wm_concat(vname)) c  from tab_test group by ...二、一列转多行 with a as (select '/ABC/AA/AD/ABD/JI/CC/ALSKD/AL
  • 一列的月份是根据时间区间查询出来的,参数为起始时间和结束时间,随着参数的不同时间区间会发生变化,但都是连续的,格式也是固定的,所以转换为一行数据的列数也是随之变化的,希望大神可以帮我实现想要的效果
  • Oracle 行转列转行 的Sql语句总结
  • pivot函数表达式: 有个职工部门工资表pivot_tmp,数据如下: 如果我们想要求各部门的工资和,很简单个sum和group by 就满足了。 select t.dept_name 部门,sum(t.salary) 工资总额 from pivot_tmp t ...
  • Oracle实现动态行转列

    千次阅读 2019-08-02 13:39:23
    oracle中要实现行转列的方式有很多种,比如case when …else …end 、wm_concat()函数,lag() over() 、lead() over() 函数等,以及11g版本后的pivot函数都可实现。可根据具体的需求选取不同的方式。 前两天恰好...
  • 多行字符串 这个比较简单,用||或concat函数可以实现 ? 1 ... select concat(id,username) str from ... 字符串 实际上就是拆分字符串的问题,可以使用 substr、instr、regexp_substr函数方式 ...
  • Oracle行转列转行的Sql语句总结

    万次阅读 2015-06-12 17:11:09
    []、行转列   1.1、初始测试数据   表结构:TEST_TB_GRADE   Sql代码  create table TEST_TB_GRADE  (   ID NUMBER(10) not null,   USER_NAME VARCHAR2(20 CHAR),   COURSE VARCHAR2(20
  • oracle 行转列转行

    万次阅读 2012-02-13 15:02:40
    []、行转列 1.1、初始测试数据 表结构:TEST_TB_GRADE Sql代码 create table TEST_TB_GRADE ( ID NUMBER(10) not null, USER_NAME VARCHAR2(20 CHAR), COURSE VARCHAR2(20 CHAR)
  • oracle 行转列 转行函数理解

    千次阅读 2019-12-10 18:14:42
    1、pivot 行转列函数 含义:pivot 聚合函数(字段1) for 字段2 in (值1,值2,值3...) 将字段2中的值1,值2,值3...作为字段名称在对字段1根据聚合函数做聚合(SUM、max、min、avg等)。 例、原表为: 将这个表格...
  • Oracle 行转列小结

    万次阅读 热门讨论 2015-07-26 12:45:51
    最近在工作中,对行转列进行了应用,在此做个简单的小结。  转换过程如下:   1、创建表结构 CREATE TABLE RowToCol ( ID NUMBER(10) not null, USER_NAME VARCHAR2(20 CHAR), COURSE VARCHAR2...
  • oracle和sql server 把一列转一行显示

    千次阅读 2017-04-06 08:58:54
    Oracle一列的多行数据拼成一行显示字符oracle 提供了两个函数WMSYS.WM_CONCAT 和 ListAgg函数。 www.2cto.com 先介绍:WMSYS.WM_CONCAT 例: id name 1 aa 2 bb 3 cc 要的结果是”aa,bb,cc”select ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 179,021
精华内容 71,608
关键字:

oracle一行转一列