`

[转]ORACLE 行转列问题

 
阅读更多
/*物料 需要数量 需要仓库 现存量仓库 现存量仓库数量 批次 

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动态行转列

    本文将深入探讨如何通过Oracle中的存储过程实现动态“行转列”,并结合给定文件的信息,详细解析其工作原理、优点及应用场景。 ### 核心知识点:Oracle动态行转列 #### 1. 存储过程与动态SQL 存储过程是预编译的...

    Oracle行转列(不定列)

    总的来说,Oracle数据库提供了`PIVOT`功能来实现行转列,对于确定的列数,`PIVOT`是高效且直接的解决方案。而在面对不定列时,动态SQL和自定义函数成为更合适的选择。在实际应用中,我们需要根据具体需求和数据特性...

    Oracle行转列之pivot

    在Oracle数据库中,行转列(也称为数据透视)和列转行(unpivot)是SQL查询中用于数据转换的高级功能。...通过实际的使用示例和语法说明,本文旨在为读者提供一个全面的Oracle行转列之PIVOT功能的指南。

    oracle行转列

    "Oracle行转列"是数据库查询中常见的一种需求,尤其是在数据分析和报表展示时。这个主题涉及到Oracle数据库中的聚合函数、分析函数以及一些高级SQL技巧。 首先,"行转列"的基本思想是将数据库表中的一列数据转换为...

    oracle行转列较精典的解决方案

    ### Oracle行转列的经典解决方案 在Oracle数据库管理与开发过程中,经常会遇到需要将数据表中的行数据转换为列数据的情况,这种操作被称为“行转列”或者“行列转换”。行列转换是数据分析、报表生成等场景中非常...

    Sql,oracle数据表行转列问题

    SQL行转列问题解决方案 SQL行转列问题是指将行记录转换为列记录的操作。本文将详细讲解SQL行转列问题的解决方案,并提供了一个具体的实例来帮助读者更好地理解该问题。 问题描述 假设我们有一个学生成绩表tb,...

    Oracle行转列

    Oracle行转列 Oracle行转列是指在Oracle数据库中将行数据转换为列数据或将列数据转换为行数据的操作。这种操作在实际应用中非常有用,例如,在数据报表、数据分析和数据挖掘等领域都需要使用行转列操作。 1. 列...

    oracle行转列,列转行的例子

    oracle行转列,列转行的例子

    oracle 行转列

    ### Oracle 行转列知识点详解 #### 一、Oracle 行转列概念及应用场景 在数据库操作中,经常需要对数据进行格式上的调整以便更好地分析或展示数据。其中,“行转列”是一种常见的数据处理方式,它指的是将原本存储...

    oracle实现行转列功能,并使用逗号进行隔开拼接,成为一条数据.pdf

    Oracle 实现行转列功能并使用逗号进行隔开拼接成为一条数据 Oracle 中实现行转列功能,并使用逗号进行隔开拼接,成为一条数据是指将多行数据合并成一行数据,并用逗号分隔每个字段的值。这种功能在实际应用中非常...

    oracle行转列聚合函数WMSYS.WM_CONCAT

    ### Oracle行转列聚合函数WMSYS.WM_CONCAT详解 #### 一、概述 在进行数据处理时,经常会遇到需要将多行数据合并为单行的情况,这通常被称为“行转列”。Oracle数据库提供了多种方法来实现这一需求,其中`WMSYS.WM_...

    Oracle的列转行问题

    列转行(Pivot)和行转列(Unpivot)是两种基本操作,可以将数据按照不同的维度进行组织。传统的列转行方法通常涉及`DECODE`或`CASE`函数与聚合函数如`MAX`或`MIN`的结合,但这些方法可能在处理大量数据时对性能造成...

    oracle的列转行问题

    Oracle 列转行问题解决方案 Oracle 数据库中,列转行问题是一个非常传统的话题。在这个问题中,我们需要将行数据转换成不同的列表示,或者将不同的列数据写到同一列的不同行上。这种问题在实际应用中非常常见,如将...

    ORACLE行转列

    许多情况下,由于程序中需要将行转为列展示,如果使用ORACLE那么这个资源适合你。

    游标分类汇总行转列oracleplsql

    本示例展示了如何使用Oracle PL/SQL中的游标来进行数据的分组统计,并通过程序逻辑实现了一种类似“行转列”的效果。这对于初学者来说是非常有价值的实践案例,可以帮助他们更好地理解游标的工作原理及其应用。同时...

Global site tag (gtag.js) - Google Analytics