简体   繁体   English

Oracle 中的动态反透视表

[英]Dynamically unpivot table within Oracle

I have a table with several hundred columns that I need to unpivot.我有一个包含数百列的表,我需要取消数据透视。 All of the columns that need to be unpivoted start with 'SIM_'.所有需要取消透视的列都以“SIM_”开头。 I know how to do this statically (example below), but I'd like a dynamic solution - as the number of columns that need be be unpivot is both long and may change over time.我知道如何静态地做到这一点(下面的例子),但我想要一个动态的解决方案——因为需要取消透视的列数既长又可能随时间变化。

SELECT
    *
FROM
    (SELECT
        ID, 
        NAME,
        SIM_1, 
        SIM_2, 
        SIM_3
    FROM
        SAMPLE_TABLE
    ) T UNPIVOT(SIM_RESULT FOR SIM IN (SIM_1, SIM_2, SIM_3))

Maybe you could (re)create a view when there is a need to refresh the list of columns.当需要刷新列列表时,也许您可​​以(重新)创建一个视图。 This way you will have the accurate list of columns and a way to show real data.这样,您将获得准确的列列表和显示真实数据的方式。 It does the unpivoting of all columns (like SIM_%) in the time of execution.它在执行时对所有列(如 SIM_%)进行反透视。

/*    sample table and data
CREATE TABLE AA_TST
    (ID NUMBER(6), SIM_A VARCHAR2(20), SIM_B VARCHAR2(20), SIM_C VARCHAR2(20), SIM_D VARCHAR2(20), SIM_E VARCHAR2(20));

INSERT INTO AA_TST  VALUES(1, 'A', 'B', 'C', 'D', 'E');
INSERT INTO AA_TST  VALUES(2, 'AA', 'BB', 'CC', 'DD', 'EE');
INSERT INTO AA_TST  VALUES(3, 'AAA', 'BBB', 'CCC', 'DDD', 'EEE');
*/

Declare
        col_list        VarChar2(1000);
        myViewSQL       VarChar2(1000);
Begin
        SELECT  LISTAGG(column_name, ', ') WITHIN GROUP (ORDER BY column_name) 
        INTO    col_list
        FROM    all_tab_columns
        WHERE   table_name  = 'AA_TST' And     
                column_name LIKE 'SIM_%';
    --
        myViewSQL := 'SELECT VALUE_NAME, VALUE_OF FROM AA_TST UNPIVOT (VALUE_OF FOR VALUE_NAME IN(' || col_list || '))';
        execute immediate 'CREATE or replace VIEW AA_TST_VIEW AS ' || myViewSQL;
End;
/
SELECT * FROM AA_TST_VIEW;
--
--  R e s u l t 
--
--  anonymous block completed
--  VALUE_NAME VALUE_OF           
--  ---------- --------------------
--  SIM_A      A                    
--  SIM_B      B                    
--  SIM_C      C                    
--  SIM_D      D                    
--  SIM_E      E                    
--  SIM_A      AA                   
--  SIM_B      BB                   
--  SIM_C      CC                   
--  SIM_D      DD                   
--  SIM_E      EE                   
--  SIM_A      AAA                  
--  SIM_B      BBB                  
--  SIM_C      CCC                  
--  SIM_D      DDD                  
--  SIM_E      EEE                  
--  
--   15 rows selected 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM