`

oracle行转列(动态行转不定列)

 
阅读更多
---------------------------------------------------------------建表
----------------判断表是否存在
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;  

 

分享到:
评论

相关推荐

    Oracle行转列(不定列)

    其中,"行转列(不定列)"是数据库查询中的一种常见需求,尤其是在数据分析和报表生成时。本篇文章将详细探讨Oracle如何实现行转列为列的过程,以及在面对不确定列数时的解决方案。 在传统的SQL查询中,数据通常是...

    Oracle行转列之pivot

    在Oracle数据库中,行转列(也称为数据透视)和列转行(unpivot)是SQL查询中用于数据转换的高级功能。从Oracle 11g版本开始,引入了PIVOT和UNPIVOT关键字,以支持显式的查询转换,即从行数据转换为列数据,或从列...

    oracle中实现列转行实例

    oracle中实现列转行实例,有表的创建,数据的插入,查询的sql

    rowtocol.rar_RowToCol_oracle 动态列

    描述中提到的“动态行转不定列”和“自动转换”暗示了这是一个处理不固定数量列的解决方案,而“列数限制为oracle限制”意味着这个方法考虑到了Oracle对最大列数的规定。 Oracle提供了几种方法来实现行转列,其中最...

    oracle行列转换

    行转列是指将数据库表中的多行转换为一列。这种操作可以使用 AGGREGATE FUNCTION 语句来实现。 示例代码: ```sql SELECT id, MAX(decode(cn, 'c1', cv, NULL)) AS c1, MAX(decode(cn, 'c2', cv, NULL)) AS c2, ...

    Oracle实现行列转换的方法分析

    其次,对于不定列的行列转换,当列的数量不是预先确定的,可能需要借助PL/SQL编写自定义函数。例如,如果我们有一个表,包含两个列c1和c2,我们要将c1相同的行合并为一列,可以用以下PL/SQL函数: ```sql CREATE OR...

    oracle19c升级时区版本 32->42,解决数据泵导数据TSTZ报错

    - **预处理数据**:在升级时区前,先将所有TSTZ类型的列转换为不带时区的TIMESTAMP类型,然后在升级后再转换回来。 - **使用兼容模式**:在导入数据时,可以指定`TIMESTAMP WITH TIME ZONE`的处理方式,使其与源...

    Oracle数据库规范

    - 定长字符型列应使用CHAR类型,不定长字符型列则使用VARCHAR2类型。 - 对于固定长度的列,使用CHAR类型可以提高查询速度。 - 不定长度的列使用VARCHAR2类型,以避免处理空格所带来的效率问题。 - 日期字段应...

    达内-ORACLE学习笔记

    - **伪列**:ROWID和ROWNUM,用于标识行的位置和编号,但并不实际存储在表中。 ### 序列、视图与索引 - **序列(SEQUENCE)**:自动产生唯一的序列号,常用于自增主键。 - **视图(VIEW)**:虚拟表,基于一个或多...

    ORACLE数据库sql语言 、函数及常用命令

    数据库DATABASE、表TABLE、列COLUMN、行ROW、关键字PRIMARY KEY、索引INDEX 二、 数据类型: LONG RAM:超长大型数据(照片、图形、描述等不定长数据)。 DATE:包含日期和时间。 INTEGER:有符号全长二进制整数(31...

    Oracle原厂数据库规范.ppt

    对于经常被UPDATE且更新列占用较大空间的表,应设置较高的PCTFREE值,以减少行迁移。 - 对于可能出现热点块的表,也需要较大的PCTFREE值,以降低热点现象。 2. **事务参数**: - `initrans`参数设定初始事务槽的...

    Oracle事例

    check 检查约束,使列的值符合一定的标准范围 unqiue 唯一性约束 foreign key 外部键约束 29、查看创建视图的select语句 SQL>set view_name,text_length from user_views; SQL>set long 2000; 说明:可以根据...

    PLSQL基础入门

    * ROWID:是数据库中每行的唯一标识符,ROWID在磁盘上需要10个字节的存储空间,并使用18个字符来显示。 Composite Datatypes包括: * PL/SQL TABLES:用于存储表格数据。 PLSQL基础知识点包括变量声明、数据类型...

    数据库基础知识试题.pdf

    数据库基础知识试题.pdf 本资源是一个数据库基础知识试题集合,涵盖了数据库的基本概念、SQL语句、...19. ORACLE中char类型与varchar2类型的区别:char类型是定长字符数据类型,varchar2类型是不定长字符数据类型。

    (完整word版)数据库基础知识试题(含答案).doc

    * 在 Oracle 中,char 类型与 varchar2 类型的区别是 char 为定长字符数据类型,而 varchar2 为不定长字符数据类型。 数据 normalization * 数据 normalization 是一种数据库设计技术,旨在减少数据冗余和依赖性。...

    数据库规范

    定长字符型列应使用`CHAR`类型,而不定长字符型列则应使用`VARCHAR2`类型。使用`CHAR`类型可以提高查询速度,但要注意处理不定长字符串时可能导致的效率问题和处理不便。此外,日期字段应当定义为`DATE`类型,若需要...

    java面试题第五部分:数据库和虚拟机

    第二范式要求每一行数据只与一个列相关,即不存在部分依赖;第三范式则规定每个属性都直接依赖于主键,避免传递依赖。 2. **自增表与InnoDB和MyISAM表的区别**:InnoDB表在删除数据并重启后,自增ID会丢失,因为...

    DB,SQL 里面有代码操作,讲解详细

    * 表(Table):存储数据的基本单元,由行和列组成。 * 视图(View):查询结果集的序列。 * 序列(Sequence):产生主键的索引。 * 索引(Index):提高查询效率的数据结构。 二、数据库对象的命名规则 数据库...

Global site tag (gtag.js) - Google Analytics