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

    千次阅读 2018-11-23 17:44:24
    列:把一行多列数据转换成一列多行数据 列转行:把一列多行数据转换成一行多列数据 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行转列转行大全

    千次阅读 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-11-21 09:45:09
    oracle多行单行多列(列数需要固定) 需求:从A成B A: B: 需要用到以下函数:wm_concat(多行成一列)、case when then else end、regexp_substr sql如下: SELECT material_code, store_id, case ...

    oracle多行转单行多列(列数需要固定)

    需求:从A转成B
    A:
    在这里插入图片描述
    B:
    在这里插入图片描述

    需要用到以下函数:wm_concat(多行转成一列)、case when then else end、regexp_substr

    sql如下:

    	SELECT material_code,
                     store_id,
                     case
                       WHEN REGEXP_SUBSTR(wm_concat(shipping_space),'[^,]+',1,1) = '好件位' THEN
                        REGEXP_SUBSTR(wm_concat(place_note), '[^,]+', 1, 1)
                       WHEN REGEXP_SUBSTR(wm_concat(shipping_space),'[^,]+',1,2) = '好件位' THEN
                        REGEXP_SUBSTR(wm_concat(place_note), '[^,]+', 1, 2)
                       WHEN REGEXP_SUBSTR(wm_concat(shipping_space),
                                          '[^,]+',1,3) = '好件位' THEN
                        REGEXP_SUBSTR(wm_concat(place_note), '[^,]+', 1, 3)
                       else
                        ''
                     END good,
                     case
                       WHEN REGEXP_SUBSTR(wm_concat(shipping_space),'[^,]+',1,1) = '坏件位' THEN
                        REGEXP_SUBSTR(wm_concat(place_note), '[^,]+', 1, 1)
                       WHEN REGEXP_SUBSTR(wm_concat(shipping_space),'[^,]+',1,2) = '坏件位' THEN
                        REGEXP_SUBSTR(wm_concat(place_note), '[^,]+', 1, 2)
                       WHEN REGEXP_SUBSTR(wm_concat(shipping_space),'[^,]+',1,3) = '坏件位' THEN
                        REGEXP_SUBSTR(wm_concat(place_note), '[^,]+', 1, 3)
                       else
                        ''
                     END bad,
                     case
                       WHEN REGEXP_SUBSTR(wm_concat(shipping_space),'[^,]+',1,1) = '待修位' THEN
                        REGEXP_SUBSTR(wm_concat(place_note), '[^,]+', 1, 1)
                       WHEN REGEXP_SUBSTR(wm_concat(shipping_space),'[^,]+',1,2) = '待修位' THEN
                        REGEXP_SUBSTR(wm_concat(place_note), '[^,]+', 1, 2)
                       WHEN REGEXP_SUBSTR(wm_concat(shipping_space),'[^,]+',1,3) = '待修位' THEN
                        REGEXP_SUBSTR(wm_concat(place_note), '[^,]+', 1, 3)
                       else
                        ''
                     END repair
                from t_spt_material_place t 
                ---若要查全部数据则去掉
                where t.material_code='103010001'
               group by material_code, store_id;
    
    展开全文
  • Oracle 行转列转行

    万次阅读 2016-05-16 18:37:58
    在生成报表的时候,很时候对某取值固定或者有限的几个值时,进行转列分析。如下: facility取值只有四种,每种一列,遇到相同facility求和。如下图: 实现方式 DECODE 利用DECODE函数、聚合函数SUM、GROUP ...

    场景

    在生成报表的时候,很多时候对某列取值固定或者有限的几个值时,进行转列分析。如下:


    facility列取值只有四种,每种一列,遇到相同facility求和。如下图:

    实现方式

    DECODE

    利用DECODE函数、聚合函数SUM、GROUP BY分组实现。

    WITH CO_ORDER AS(    
      SELECT 'DOM1' Customer, 'ZHA01' facility , 4000 TEU FROM dual UNION ALL    
      SELECT 'DOM1' Customer, 'ZHA01' facility , 5000 TEU FROM dual UNION ALL    
      SELECT 'DOM1' Customer, 'ZHA02' facility , 9000 TEU FROM dual UNION ALL   
      SELECT 'DOM1' Customer, 'ZHA03' facility , 9000 TEU FROM dual UNION ALL  
      SELECT 'DOM1' Customer, 'ZHA04' facility , 4000 TEU FROM dual UNION ALL  
      SELECT 'DOM2' Customer, 'ZHA01' facility , 6500 TEU FROM dual UNION ALL    
      SELECT 'DOM2' Customer, 'ZHA02' facility , 6000 TEU FROM dual UNION ALL    
      SELECT 'DOM2' Customer, 'ZHA03' facility , 5000 TEU FROM dual UNION ALL    
      SELECT 'DOM2' Customer, 'ZHA04' facility , 3000 TEU FROM dual     
    )
    SELECT t.Customer, SUM(decode(t.facility, 'ZHA01', t.teu)) AS ZHA01,
           SUM(decode(t.facility, 'ZHA02', t.teu)) AS ZHA02,
           SUM(decode(t.facility, 'ZHA03', t.teu)) AS ZHA03,
           SUM(decode(t.facility, 'ZHA04', t.teu)) AS ZHA04
      FROM CO_ORDER t
      GROUP BY t.Customer;
    该方式简单直观,当然每列具体要标示出来,所以只能处理固定种类的,不易程序后期扩展。

    case

    case函数的写法相对比较简洁,如下

    WITH CO_ORDER AS(      
      SELECT 'DOM1' Customer, 'ZHA01' facility , 4000 TEU FROM dual UNION ALL      
      SELECT 'DOM1' Customer, 'ZHA01' facility , 5000 TEU FROM dual UNION ALL      
      SELECT 'DOM1' Customer, 'ZHA02' facility , 9000 TEU FROM dual UNION ALL     
      SELECT 'DOM1' Customer, 'ZHA03' facility , 9000 TEU FROM dual UNION ALL    
      SELECT 'DOM1' Customer, 'ZHA04' facility , 4000 TEU FROM dual UNION ALL    
      SELECT 'DOM2' Customer, 'ZHA01' facility , 6500 TEU FROM dual UNION ALL      
      SELECT 'DOM2' Customer, 'ZHA02' facility , 6000 TEU FROM dual UNION ALL      
      SELECT 'DOM2' Customer, 'ZHA03' facility , 5000 TEU FROM dual UNION ALL      
      SELECT 'DOM2' Customer, 'ZHA04' facility , 3000 TEU FROM dual       
    ) 
    SELECT Customer,
        sum (CASE WHEN facility = 'ZHA01' THEN TEU ELSE 0 END) AS ZHA01, 
        sum (CASE WHEN facility = 'ZHA02' THEN TEU ELSE 0 END) AS ZHA02,
        sum (CASE WHEN facility = 'ZHA03' THEN TEU ELSE 0 END) AS ZHA03,
        sum (CASE WHEN facility = 'ZHA04' THEN TEU ELSE 0 END) AS ZHA04
    FROM CO_ORDER GROUP BY Customer ORDER BY Customer ASC;



    值得注意的是 case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略

    PIVOT

    直接使用Oracle 关键字PIVOT。

    WITH CO_ORDER AS(    
      SELECT 'DOM1' Customer, 'ZHA01' facility , 4000 TEU FROM dual UNION ALL    
      SELECT 'DOM1' Customer, 'ZHA01' facility , 5000 TEU FROM dual UNION ALL    
      SELECT 'DOM1' Customer, 'ZHA02' facility , 9000 TEU FROM dual UNION ALL   
      SELECT 'DOM1' Customer, 'ZHA03' facility , 9000 TEU FROM dual UNION ALL  
      SELECT 'DOM1' Customer, 'ZHA04' facility , 4000 TEU FROM dual UNION ALL  
      SELECT 'DOM2' Customer, 'ZHA01' facility , 6500 TEU FROM dual UNION ALL    
      SELECT 'DOM2' Customer, 'ZHA02' facility , 6000 TEU FROM dual UNION ALL    
      SELECT 'DOM2' Customer, 'ZHA03' facility , 5000 TEU FROM dual UNION ALL    
      SELECT 'DOM2' Customer, 'ZHA04' facility , 3000 TEU FROM dual     
    )
    
    SELECT * FROM (
    SELECT t.Customer, t.facility, SUM(TEU) EU FROM CO_ORDER t
    GROUP BY t.Customer, t.facility
    ) t pivot(SUM(t.EU) FOR facility IN ('ZHA01', 'ZHA02', 'ZHA03', 'ZHA04'));
    改方式更加的简便,最重要的是,分列条件是动态的,不需要考虑取值的可能性,利于扩展。不过,PIVOT是Oracle 11g后才出现的,所以使用时要注意环境。

    另外,列名是动态的,所以在select中写列名报错,这点不知道怎么解决,有高手的话帮忙看下。

    多列求和

    转列之后,很多时候需要对同一行中某些列求和。

    WITH CO_ORDER AS(    
      SELECT 'DOM1' Customer, 'ZHA01' facility , 4000 TEU FROM dual UNION ALL    
      SELECT 'DOM1' Customer, 'ZHA01' facility , 5000 TEU FROM dual UNION ALL    
      SELECT 'DOM1' Customer, 'ZHA02' facility , 9000 TEU FROM dual UNION ALL   
      SELECT 'DOM1' Customer, 'ZHA03' facility , 9000 TEU FROM dual UNION ALL  
      SELECT 'DOM1' Customer, 'ZHA04' facility , 4000 TEU FROM dual UNION ALL  
      SELECT 'DOM2' Customer, 'ZHA01' facility , 6500 TEU FROM dual UNION ALL    
      SELECT 'DOM2' Customer, 'ZHA02' facility , 6000 TEU FROM dual UNION ALL    
      SELECT 'DOM2' Customer, 'ZHA03' facility , 5000 TEU FROM dual UNION ALL    
      SELECT 'DOM2' Customer, 'ZHA04' facility , 3000 TEU FROM dual     
    )
    select Customer,ZHA01,ZHA02,ZHA03,ZHA04,ZHA01+ZHA02+ZHA03 +ZHA04 as TOTAL from (
    SELECT t.Customer, sum(decode(t.facility, 'ZHA01', t.teu)) AS ZHA01,
           sum(decode(t.facility, 'ZHA02', t.teu)) AS ZHA02,
           sum(decode(t.facility, 'ZHA03', t.teu)) AS ZHA03,
           sum(decode(t.facility, 'ZHA04', t.teu)) AS ZHA04 
      FROM CO_ORDER t
      group by t.Customer);

    效果如下:


    WM_CONCAT

    该函数用于把列值以逗号分隔显示成一行。如下:

    WITH CO_ORDER AS(    
      SELECT 'DOM1' Customer, 'ZHA01' facility , 4000 TEU FROM dual UNION ALL    
      SELECT 'DOM1' Customer, 'ZHA01' facility , 5000 TEU FROM dual UNION ALL    
      SELECT 'DOM1' Customer, 'ZHA02' facility , 9000 TEU FROM dual UNION ALL   
      SELECT 'DOM1' Customer, 'ZHA03' facility , 9000 TEU FROM dual UNION ALL  
      SELECT 'DOM1' Customer, 'ZHA04' facility , 4000 TEU FROM dual UNION ALL  
      SELECT 'DOM2' Customer, 'ZHA01' facility , 6500 TEU FROM dual UNION ALL    
      SELECT 'DOM2' Customer, 'ZHA02' facility , 6000 TEU FROM dual UNION ALL    
      SELECT 'DOM2' Customer, 'ZHA03' facility , 5000 TEU FROM dual UNION ALL    
      SELECT 'DOM2' Customer, 'ZHA04' facility , 3000 TEU FROM dual     
    )
    SELECT Customer,WM_CONCAT(facility) ALL_FACILITY FROM CO_ORDER GROUP BY Customer;
    效果如下:


    去重

    例子中,(wb_id, reply, addre) 作为表的unique key, 如果(wb_id, reply, addre) 相同,保留字段TEU 最大值的记录。删除其他记录。

    WITH tt AS (
      SELECT 'DOM1' wb_id, 'ZHA01' reply ,  'ZHA01' addre ,4000 TEU FROM dual UNION ALL      
      SELECT 'DOM1' wb_id, 'ZHA01' reply ,  'ZHA01' addre ,5000 TEU FROM dual UNION ALL  --- (wb_id, reply, addre)与上条记录相同,不过 TEU 更大,保留。
      SELECT 'DOM1' wb_id, 'ZHA02' reply ,  'ZHA01' addre ,9000 TEU FROM dual UNION ALL     
      SELECT 'DOM2' wb_id, 'ZHA01' reply ,  'ZHA01' addre ,9000 TEU FROM dual UNION ALL    
      SELECT 'DOM2' wb_id, 'ZHA04' reply ,  'ZHA01' addre ,4000 TEU FROM dual UNION ALL    
      SELECT 'DOM2' wb_id, 'ZHA01' reply ,  'ZHA01' addre ,6500 TEU FROM dual           --- (wb_id, reply, addre)与第四条记录相同,不过 TEU 小,删除。
    )
    
    -- 选出待删除的数据集合
    SELECT *  FROM tt
    WHERE (wb_id, reply,addre) IN (SELECT wb_id, reply, addre FROM tt GROUP BY wb_id, reply, addre HAVING count(1) > 1)
    AND (wb_id, reply,reply, TEU) NOT IN (SELECT wb_id, reply, addre, max(TEU) FROM tt group by wb_id, reply, addre)
    ;


    列转行

    上面说到用 PRIVOT 进行行转列,现在看下 UNPRIVOT 操作。从名字上看,就是 PRIVOT 加前缀 UN,意义不言而喻,就是进行列转行。先看例子。

    WITH CO_ORDER2 AS(      
      SELECT 'DOM1' Customer, 'office1'  ZHA02, 'office1' ZHA03, 'office2' ZHA04 FROM dual UNION ALL      
      SELECT 'DOM1' Customer, 'office2'  ZHA02, 'office3' ZHA03, 'office2' ZHA04 FROM dual UNION ALL        
      SELECT 'DOM2' Customer, 'office4'  ZHA02, 'office1' ZHA03, 'office2' ZHA04 FROM dual UNION ALL      
      SELECT 'DOM2' Customer, 'office3'  ZHA02, 'office1' ZHA03, 'office1' ZHA04 FROM dual       
    )
    --SELECT * FROM CO_ORDER2 
    SELECT Customer, offcs, facility FROM CO_ORDER2 UNPIVOT (offcs FOR facility IN ( ZHA02, ZHA03, ZHA04) );  
    首先数据原始结构如下:


    而利用 UNPRIVOT 处理后,结果如下:


    UNPRIVOT 帮我们生成了两个新列,一列用于存放 office1 之类的值,另一个新列存的是 这个数据来源于之前那个原始列名。

    其实它做的很简单,就是对每行原始数据的指定列的每个格子进行遍历,生成一条条数据。将原有的结构进行打平。因此,

    处理后数据的行数 = 原始数据行数  * 指定列数

    因此上面 产生 了 12 条数据。

    不过这也不是绝对的,当某个数据为空是,最终生成的数据会被 UNPRIVOT 给删除。看下面:

    WITH CO_ORDER2 AS(      
      SELECT 'DOM1' Customer, 'office1'  ZHA02, 'office1' ZHA03, 'office2' ZHA04 FROM dual UNION ALL      
      SELECT 'DOM1' Customer, 'office2'  ZHA02, '' ZHA03, 'office2' ZHA04 FROM dual UNION ALL        
      SELECT 'DOM2' Customer, 'office4'  ZHA02, 'office1' ZHA03, 'office2' ZHA04 FROM dual UNION ALL      
      SELECT 'DOM2' Customer, null  ZHA02, 'office1' ZHA03, 'office1' ZHA04 FROM dual       
    )
    --SELECT * FROM CO_ORDER2 
    SELECT Customer, offcs, facility FROM CO_ORDER2 UNPIVOT (offcs FOR facility IN ( ZHA02, ZHA03, ZHA04) ); 
    此时下面只产生了 10 行数据。


    在上面的 数据中,我们 给其中两个格子里面,一个为 空字符串,一个是 null。最终这两条数据没出现在结果集中。

    展开全文
  • 1.多列转成一列(列转行)   --6列转成两列(列转行) 这就是最常见的列转行,主要原理是利用SQL里面的union with temp as  (select  a.iid_sn,  a.product_name,  a.sales_figures,  a.selling_...
  • Oracle行转列转行的几种方法

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

    千次阅读 2013-01-16 15:34:03
    listagg在oracle 11g release 2 版本中新增的listagg函数,listagg是个实现字符串聚合的oracle内建函数;listagg(column,'分隔符') within group (order by column) over(partition by column)分隔符可以为空,...
  • Oracle实现动态行转列

    千次阅读 2019-08-02 13:39:23
    oracle中要实现行转列的方式有很种,比如case when …else …end 、wm_concat()函数,lag() over() 、lead() over() 函数等,以及11g版本后的pivot函数都可实现。可根据具体的需求选取不同的方式。 前两天恰好...
  • Oracle 多行转多列

    千次阅读 2019-09-19 16:52:42
    今天碰到个需求是多行转多列,在网上没找到类似问题(多行转多列)的有效解决方法 这是我个人头脑风暴出的解决方式,请参考 比如个表,有多个维度(时间,险种,机构), -- Create table create table t ( ...
  • 多行字符串 这个比较简单,用||或concat函数可以实现 ? 1 ... select concat(id,username) str from ... 字符串转多列 实际上就是拆分字符串的问题,可以使用 substr、instr、regexp_substr函数方式 ...
  • 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列分成多列行转

    千次阅读 2019-02-14 14:48:15
    列分成多列方法: 1.SELECT REGEXP_SUBSTR(name,'^[^ ]*') first_name, REGEXP_SUBSTR(name, '([[:alpha:]]+)$') middle_name FROM CELEBRITY 2.SELECT SUBSTR(NAME, 1, INSTR(NAME, ' ')-1) FIRST_NAME, SUBSTR...
  • Oracle 行转列 动态出转换的

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

    万次阅读 2018-07-24 14:44:44
    最近项目需要进行行转列,经过上网查资料发现了wmsys.wm_concat和LISTAGG函数,在这分享给大家 wmsys.wm_concat是oracle 10g推出的,用来连接字符串,LISTAGG是oracle 11g推出的,它的作用和wmsys.w...
  • Oracle字符串和多列行转换

    千次阅读 2018-03-21 09:45:10
    多行字符串 ...select id||username str from app_user字符串转多列 实际上就是拆分字符串的问题,可以使用 substr、instr、regexp_substr函数方式字符串多行 使用union all函数等方式wm_conc
  • 目前很多行转列都使用了 oracle 11g新增的pivot ,但是我用达梦国产数据库不支持该函数,所以使用case when的方式 首先,我们需要构造个两列的数据,也就是查询结果 select 'aaaaa' as flag ,'1' as num from ...
  • Oracle行转列转行的Sql语句总结

    万次阅读 2016-11-28 17:32:32
    Oracle行转列转行的Sql语句总结 多行字符串 这个比较简单,用||或concat函数可以实现  SQL Code  1 2   select concat(id,username) str from app_user select...
  • 但是查询到数据需要按病人显示为一行,方便前端进行显示。 下图为原数据: 先根据条件查询你需要的数据,多行展示: 使用pivot,将多行转换为多列 注意:如果in中的同义词列明为中文时,需要用双引号 ...
  • 比如我这里又一个字段是name,然后有多行 name 小红 小明 然后我想让小红,小明在一行显示, wm_concat(name) 则显示为 name 小红,小明
  • Oracle 行转列小结

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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 152,993
精华内容 61,197
关键字:

oracle一行转多列