精华内容
下载资源
问答
  • oracle动态行转列

    2013-09-13 08:47:34
    用存储过程写的动态行转列。简单易用,查询速度高效
  • ORACLE 动态行转列

    千次阅读 2014-07-23 10:49:11
    ---------------------------------------------------------------行转列的存储过程 CREATE OR REPLACE PROCEDURE P_TEST IS V_SQL VARCHAR2(2000); CURSOR CURSOR_1 IS SELECT DISTINCT T.XCLCK FROM TEST T ...
    /*物料      需要数量      需要仓库         现存量仓库            现存量仓库数量      批次 
    
    A1           2             C1               C1                  20            123 
    
    A1           2             C1               C2                  30            111 
    
    A1           2             C1               C2                  20             222 
    
    A1           2             C1               C3                  10             211 
    
    A2           3             C4               C1                  40             321 
    
    A2           3             C4               C4                  50             222 
    
    A2           3             C4               C4                  60              333 
    
    A2           3             C4               C5                   70             223 
    
    我需要把上面的查询结果转换为下面的。
    
    物料      需要数量        需要仓库    C1   C2    C3     C4    C5 
    
    A1         2             C1        20   50    10     0     0 
    
    A2         3             C4        40   0     0      110   70 
    
    */ 
    
    ---------------------------------------------------------------建表
    
    ----------------判断表是否存在
    
    declare num number; 
    
    begin 
    
        select count(1) into num from user_tables where table_name='TEST';
    
        if num>0 then 
    
          execute immediate 'drop table TEST';
    
        end if;
    
    end;
    
    ----------------建表
    
    CREATE TABLE TEST(
    
        WL VARCHAR2(10),
    
        XYSL INTEGER,
    
        XYCK VARCHAR2(10),
    
        XCLCK VARCHAR2(10),
    
        XCLCKSL INTEGER,
    
        PC INTEGER
    
    );
    
    ----------------第一部分测试数据
    
    INSERT INTO TEST VALUES('A1', 2, 'C1', 'C1' ,        20,         123); 
    
    INSERT INTO TEST VALUES('A1', 2, 'C1', 'C2' ,        30,         111); 
    
    INSERT INTO TEST VALUES('A1', 2, 'C1', 'C2' ,        20,         222); 
    
    INSERT INTO TEST VALUES('A1', 2, 'C1', 'C3' ,        10,         211); 
    
    INSERT INTO TEST VALUES('A2', 3, 'C4', 'C1' ,        40,         321); 
    
    INSERT INTO TEST VALUES('A2', 3, 'C4', 'C4' ,        50,         222); 
    
    INSERT INTO TEST VALUES('A2', 3, 'C4', 'C4' ,        60,         333); 
    
    INSERT INTO TEST VALUES('A2', 3, 'C4', 'C5' ,        70,         223);
    
    COMMIT;
    
    --select * from test;
    
    ---------------------------------------------------------------行转列的存储过程
    
    CREATE OR REPLACE PROCEDURE P_TEST IS
    
      V_SQL VARCHAR2(2000);
    
      CURSOR CURSOR_1 IS SELECT DISTINCT T.XCLCK FROM TEST T ORDER BY XCLCK; 
    
        
    
        BEGIN
    
          V_SQL := 'SELECT WL,XYSL,XYCK';
    
          FOR V_XCLCK IN CURSOR_1
    
          LOOP
    
            V_SQL := V_SQL || ',' || 'SUM(DECODE(XCLCK,''' || V_XCLCK.XCLCK ||
    
                     ''',XCLCKSL,0)) AS ' || V_XCLCK.XCLCK;
    
          END LOOP;
    
          
    
          V_SQL := V_SQL || ' FROM TEST GROUP BY WL,XYSL,XYCK ORDER BY WL,XYSL,XYCK';
    
          --DBMS_OUTPUT.PUT_LINE(V_SQL);
    
          V_SQL := 'CREATE OR REPLACE VIEW RESULT  AS '||  V_SQL;
    
          --DBMS_OUTPUT.PUT_LINE(V_SQL);
    
          EXECUTE IMMEDIATE V_SQL;
    
        END;
    
    ----------------------------------------------------------------结果
    
    ----------------执行存储过程,生成视图
    
    BEGIN
    
      P_TEST;               
    
    END;
    
    ----------------结果
    
    SELECT * FROM RESULT T;
    
    WL                                            XYSL XYCK               C1         C2         C3         C4         C5
    
    ---------- --------------------------------------- ---------- ---------- ---------- ---------- ---------- ----------
    
    A1                                               2 C1                 20         50         10          0          0
    
    A2                                               3 C4                 40          0          0        110         70
    
    ----------------第二部分测试数据
    
    INSERT INTO TEST VALUES('A1', 2, 'C1', 'C6' ,        20,         124); 
    
    INSERT INTO TEST VALUES('A2', 2, 'C1', 'C7' ,        30,         121); 
    
    INSERT INTO TEST VALUES('A3', 2, 'C1', 'C8' ,        20,         322); 
    
    COMMIT;
    
    ----------------报告存储过程,生成视图
    
    BEGIN
    
      P_TEST;               
    
    END;
    
    ----------------结果
    
    SELECT * FROM RESULT T;
    
    WL      XYSL      XYCK          C1       C2         C3         C4         C5         C6         C7         C8
    
    ----- ----- -------- ------- -------- ---------- ---------- ---------- ---------- ---------- ----------
    
    A1        2       C1            20       50         10          0          0         20          0          0
    
    A2        2       C1             0        0          0          0          0          0         30          0
    
    A2        3       C4            40        0          0        110         70          0          0          0
    
    A3        2       C1             0        0          0          0          0          0          0         20
    
    --------------- 删除实体
    
    DROP VIEW RESULT;
    
    DROP PROCEDURE P_TEST;
    
    DROP TABLE TEST;   
    
    
    0 
    
    0 
    
    0 
    
    

    展开全文
  • Oracle动态行转列—存储过程实现 原表结构如下: 需求: 需要把部门里面每个JOB的合计薪水统计,比如部门 deptno clerk manager ……….. 10 0 2450 解决: 写一个存储过程动态去拼接列 CREATE OR ...

    Oracle动态行转列—存储过程实现

    原表结构如下:

     

    需求:

    需要把部门里面每个JOB的合计薪水统计,比如部门

    deptno   clerk    manager  ………..

    10        0       2450

    解决:

    写一个存储过程动态去拼接列

    CREATE OR REPLACE PROCEDURE E_TEST IS

      V_SQL VARCHAR2(2000);

      --游标获取所有列 即所有的job

      CURSOR CURSOR_1 IS SELECT DISTINCT T.JOB FROM EMP T ORDER BY JOB;

     

        BEGIN

          --拼接查询sql

          V_SQL := 'SELECT deptno';

     

          --遍历游标拼接列

          FOR V_XCLCK IN CURSOR_1

          LOOP

            --动态拼接列 并对相同部门相同职位的薪水求和

            V_SQL := V_SQL || ',' || 'SUM(DECODE(JOB,''' || V_XCLCK.JOB ||

                     ''',sal,0)) AS ' || V_XCLCK.JOB;

          END LOOP;

          --拼接查询分组条件

          V_SQL := V_SQL || ' FROM EMP GROUP BY deptno ORDER BY deptno';

          --把查询到的创建为视图

          V_SQL := 'CREATE OR REPLACE VIEW RESULT  AS '||  V_SQL;

          --DBMS_OUTPUT.PUT_LINE(V_SQL);

          EXECUTE IMMEDIATE V_SQL;

        END;

    查询视图的结果:

    查询视图result:

    select * from result;

     

    展开全文
  • Oracle动态行转列问题

    2016-01-11 09:43:58
    有什么好的动态行转列方法?(动态噢!) 看过pivot xml函数但结果是CLOB类型,Java读取没写出来, 请问decode函数能实现动态的行转列吗?
  • 在网上查了一些方法没用,后来想到利用oracle自带的视图函数 1.创建视图: create view view_20191106171901(最好用uuid作为视图名避免重复) as select 'aa' as aa,'bb' as bb, 'cc' as cc from dual; 2.按...

    遇到一个需求,需要把自定义sql的列名按顺序查出来。在网上查了一些方法没用,后来想到利用oracle自带的视图函数

    1.创建视图:

    create  view view_20191106171901(最好用uuid作为视图名避免重复)

    as select 'aa' as aa,'bb' as bb, 'cc' as cc from dual;

    2.按顺序查出列名
      SELECT * FROM user_tab_cols WHERE table_name ='VIEW_201911061719';
     

    3.查完后删除视图

      DROP VIEW  VIEW_201911061719;

    展开全文
  • Oracle实现动态行转列

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

    oracle中要实现行转列的方式有很多种,比如case when …else …end 、wm_concat()函数,lag() over() 、lead() over() 函数等,以及11g版本后的pivot函数都可实现。可根据具体的需求选取不同的方式。
    前两天恰好一朋友问起如何将如下表1动态转成表2的形式。
    表1在这里插入图片描述
    表2在这里插入图片描述
    ,channel_flag是查数据字典得到,值是变动的。当时第一反应是使用pivot函数。pivot函数语法是pivot(聚合函数 for 列名 in(类型))。尝试了几次,in后接子查询均报错,查资料得知若后接子查询,只能使用pivot xml函数,显然xml格式不符合需求。故最终选择使用存储过程来实现。最终的实现过程如下:

      CREATE OR REPLACE PROCEDURE p_tmp20190730  AUTHID CURRENT_USER IS
      V_SQL VARCHAR2(2000);
    
      CURSOR CURSOR_1 IS SELECT DISTINCT channel_flag FROM tmp20190730 ORDER BY channel_flag;
    
        BEGIN
          V_SQL := 'SELECT prod_code';
    
          FOR v_channel_flag IN CURSOR_1
          LOOP
            V_SQL := V_SQL || ',' || 'MAX(DECODE(channel_flag,''' || v_channel_flag.channel_flag ||
                     ''',isallow,null)) AS '  || '"' || v_channel_flag.channel_flag || '"' ;
          END LOOP;
          V_SQL := V_SQL || ' FROM tmp20190730 GROUP BY prod_code';
          DBMS_OUTPUT.PUT_LINE(V_SQL);
          V_SQL := 'CREATE TABLE TMP_RESULT  AS '||  V_SQL;
          EXECUTE IMMEDIATE V_SQL;
        END;
    

    tmp20190730为表1,最终结果tmp_result为表2.过程加
    AUTHID CURRENT_USER防止出现执行存储过程权限不足。

    展开全文
  • Oracle 行转列 动态出转换的列

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

    千次阅读 2018-11-23 17:44:24
    文章目录ORACLE行转列和列转行定义ORACLE-行转列-unpivot数据准备行转列使用ORACLE-列转行-pivot数据准备列转行使用 ORACLE行转列和列转行 定义 行转列:把一行多列数据转换成一列多行数据 列转行:把一列多行数据...
  • 前段时间在使用Oracle开发数据统计的时候,遇到一个动态行转列、列转行的问题,最终实现如下的效果: 当初设计表的时候,指标、数据及公司在一张表里,现在要求列是动态维护的,也就是说需要多表关联,实现...
  • 表test按字段a分组,字段b排序然后要纵表转为横表把分组排序每组前N数据变为新的结果集的N*m数据(m为test表分组统计的字段数) 例如成绩表,表里面有姓名,科目,成绩 需要生成的结果集是姓名,科...
  • 1.行转列: select * from ( select xxx,yyy ...2.动态行转列:select * from ( select xxx,yyy from t ) pivot xml( max(字段) for xxx in (select 动态字段 from table ) ) (即动态表转成xml 在代码中解析xml) ...
  • 工作中遇到个问题,需要支持动态行转列,方便报表展示。 起初这样写:???? select * from table_name1 a pivot (sum(nvl(citycode,0)) for co in (select distinct citycode from table_name1); ???????????????????...
  • oracle行转列动态行转不定列)

    千次阅读 2018-07-26 09:16:00
    ---------------------------------------------------------------行转列的存储过程 CREATE OR REPLACE PROCEDURE P_TEST IS V_SQL VARCHAR2(2000); CURSOR CURSOR_1 IS SELECT DISTINCT T.XCLCK FROM TEST T ...
  • select * from V_TEST_TEST_TEMP select * from (select NAME,NUMS from V_TEST_TEST_TEMP)pivot (max(NUMS) for NAME in ( 'a','b','c' )); select * from (select NAME,NUMS from V_TEST_TEST_TEMP)...
  • oracle sql 行转列

    2015-04-27 13:44:02
    --动态SQL,指subject不止语文、数学、英语这三门课程。 sql server 下测试 declare @sql varchar(8000) set @sql = 'select student as ' + '姓名' select @sql = @sql + ' , max(case Subject when ''' + ...
  • Oracle 行转列 pivot函数基本用法

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

    千次阅读 2015-08-21 16:38:36
    动态SQL实现SQL查询子集行转列
  • Oracle行转列之pivot

    2013-03-15 20:45:13
    oracle数据库最详细的行转列资料,是官方文档的详细介绍版,中文的
  • Oracle 行转列和列转行

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

    万次阅读 2019-07-05 17:16:00
    三、动态转换 3.1、使用PL/SQL CREATE OR REPLACE PROCEDURE P_TOYGSEND IS  --存放最终的SQL  LV_SQL VARCHAR2(3000);  --存放连接的SQL  SQL_COMMOND VARCHAR2(3000);  --定义游标  CURSOR CUR IS...
  • oracle 行转列,多行转列

    千次阅读 2018-11-14 10:35:23
     1) 拼接字符串,想到了 oracle Function(),这样肯定能实现,但是比较麻烦;  2) Oracle 自带的一个函数 wm_concat 函数 非常给力; 上代码 --测试表1 create table ceshi1(ID var...
  • 动态行转列 oracle环境

    2013-10-08 16:46:37
    以下是动态sql   -- 方法一 ---- create or replace package pkg_test1 as type testResultCur is ref cursor; end pkg_test1; create or replace procedure ct_test_proce_1(rst out pkg_test1...
  • 公司业务要求,需要对一批数据大批量地进行动态行转列之后进行分析,而pivot 函数in中不能使用子查询,有个方法是说可以通过动态sql拼接的方法实现,在网上找了很久之后没找到具体的方法,就自己去摸索实现了。...
  • Oracle行转列(不定列)
  • 前段时间在使用Oracle开发数据统计的时候,遇到一个动态行转列、列转行的问题,最终实现如下的效果:当初设计表的时候,指标、数据及公司在一张表里,现在要求列是动态维护的,也就是说需要多表关联,实现动态行转列...
  • http://bbs.csdn.net/topics/330039676 SQLSERVER :行列转换例子: ... 1. Oracle 11g之后新增了行列转换的函数 pivot 和 unpivot 大大简化了行列转换处理。...2. 在Oracle 10g及以前版本,...
  • 1、iBatis会自动缓存每条查询语句的列名映射,所有如果你动态生成列名的话就有可能造成查询列名无效的问题。 ibaits 会缓存查询的meta信息,...3、oracle行转列,事先需要确定查询的列信息,在列用sum和decode函数汇总

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,692
精华内容 12,276
关键字:

oracle动态行转列