Dynamic pivot in oracle sql

后端 未结 7 969

... pivot (sum(A) for B in (X))

Now B is of datatype varchar2 and X is a string of varchar2 values separated by commas.
Values for X are select distinct values

7条回答
  •  别跟我提以往
    2020-11-22 00:33

    USE DYNAMIC QUERY

    Test code is below


    --  DDL for Table TMP_TEST
    --------------------------------------------------------
    
      CREATE TABLE "TMP_TEST" 
       (    "NAME" VARCHAR2(20), 
        "APP" VARCHAR2(20)
       );
    /
    SET DEFINE OFF;
    Insert into TMP_TEST (NAME,APP) values ('suhaib','2');
    Insert into TMP_TEST (NAME,APP) values ('suhaib','1');
    Insert into TMP_TEST (NAME,APP) values ('shahzad','3');
    Insert into TMP_TEST (NAME,APP) values ('shahzad','2');
    Insert into TMP_TEST (NAME,APP) values ('shahzad','5');
    Insert into TMP_TEST (NAME,APP) values ('tariq','1');
    Insert into TMP_TEST (NAME,APP) values ('tariq','2');
    Insert into TMP_TEST (NAME,APP) values ('tariq','6');
    Insert into TMP_TEST (NAME,APP) values ('tariq','4');
    /
      CREATE TABLE "TMP_TESTAPP" 
       (    "APP" VARCHAR2(20)
       );
    
    SET DEFINE OFF;
    Insert into TMP_TESTAPP (APP) values ('1');
    Insert into TMP_TESTAPP (APP) values ('2');
    Insert into TMP_TESTAPP (APP) values ('3');
    Insert into TMP_TESTAPP (APP) values ('4');
    Insert into TMP_TESTAPP (APP) values ('5');
    Insert into TMP_TESTAPP (APP) values ('6');
    /
    create or replace PROCEDURE temp_test(
      pcursor out sys_refcursor,
        PRESULT                   OUT VARCHAR2
        )
    AS
    V_VALUES VARCHAR2(4000);
    V_QUERY VARCHAR2(4000);
    BEGIN
     PRESULT := 'Nothing';
    
    -- concating activities name using comma, replace "'" with "''" because we will use it in dynamic query so "'" can effect query.
      SELECT DISTINCT 
             LISTAGG('''' || REPLACE(APP,'''','''''') || '''',',')
             WITHIN GROUP (ORDER BY APP) AS temp_in_statement 
        INTO V_VALUES
        FROM (SELECT DISTINCT APP 
                FROM TMP_TESTAPP);
    
    -- designing dynamic query  
    
      V_QUERY := 'select * 
                    from (  select NAME,APP 
                              from TMP_TEST   )   
                   pivot (count(*) for APP in 
                         (' ||V_VALUES|| '))  
               order  by NAME' ;
    
        OPEN PCURSOR
         FOR V_QUERY;
    
    
     PRESULT := 'Success';
    
    Exception
    WHEN OTHERS THEN
     PRESULT := SQLcode || ' - ' || SQLERRM;
    END temp_test;
    

提交回复
热议问题