sql >> Base de Datos >  >> RDS >> Oracle

columnas dinámicas en oracle usando sql

Creo que es posible, aunque bastante complicado, escribir un función de tabla segmentada que devuelve una estructura variable . Su función de tabla de canalización usará la interfaz de cartucho de datos de Oracle y la magia del tipo AnyDataSet para devolver una estructura dinámica en tiempo de ejecución. Luego puede usar eso en declaraciones SQL posteriores como si fuera una tabla, es decir,

SELECT *
  FROM TABLE( your_pipelined_function( p_1, p_2 ));

Un par de referencias más que analizan la misma implementación de muestra

  • Dynamic SQL Pivoting
  • La Implementación del enfoque de interfaz sección de la Guía del desarrollador de Oracle Data Cartridge
  • Método4. Después de descargar e instalar el código PL/SQL de fuente abierta, aquí hay una implementación completa:

    --Create sample table.
    create table branch_data as
    select '100' BranchName,'1001010' CustomerNo from dual   UNION ALL 
    select '100' BranchName,'1001011' CustomerNo from dual   UNION ALL 
    select '103' BranchName,'1001012' CustomerNo from dual   UNION ALL 
    select '104' BranchName,'1001013' CustomerNo from dual   UNION ALL 
    select '104' BranchName,'1001014' CustomerNo from dual   UNION ALL 
    select '104' BranchName,'1001015' CustomerNo from dual   UNION ALL 
    select '105' BranchName,'1001016' CustomerNo from dual   UNION ALL 
    select '105' BranchName,'1001017' CustomerNo from dual   UNION ALL 
    select '106' BranchName,'1001018' CustomerNo from dual;
    
    --Create a dynamic pivot in SQL.
    select *
    from table(method4.dynamic_query(
        q'[
            --Create a select statement
            select
                --The SELECT:
                'select'||chr(10)||
                --The column list:
                listagg(
                    replace(q'!sum(case when BranchName = '#BRANCH_NAME#' then 1 else 0 end) "#BRANCH_NAME#"!', '#BRANCH_NAME#', BranchName)
                    , ','||chr(10)) within group (order by BranchName)||chr(10)||
                --The FROM:
                'from branch_data' v_sql
            from
            (
                --Distinct BranchNames.
                select distinct BranchName
                from branch_data
            )
        ]'
    ));