Thursday, April 12, 2012

Generación de Series Numéricas y Combinaciones

Para generar series numéricas se puede combinar la tabla DUAL con la cláusula CONNECT BY LEVEL si lo estructuramos correctamente. 

Anexo algunos ejemplos que les será de utilidad.

Rango de números, desde 181 al 200 :


SELECT * 
  FROM ( SELECT ROWNUM x /*+ INDEX( CBRA )*/ FROM DUAL CONNECT BY LEVEL<=200 ) x 
 WHERE x.x>180
;


Resultados:


         X
----------
       181
       182
       183
       184
       185
       186
       187
       188
       189
       190
       191
       192
       193
       194
       195
       196
       197
       198
       199
       200

20 rows selected.


Traer todos los meses del año en curso (2012):


SELECT TO_DATE(
   TO_CHAR( TRUNC( SYSDATE ), 'YYYY' )||LPAD( X, 2, '0' )||'01' , 'YYYY-MM-DD'
             ) mes FROM ( SELECT ROWNUM x /*+ INDEX( CBRA )*/ FROM DUAL 
                      CONNECT BY LEVEL<=12 )
;


Resultado:


MES
---------
01-JAN-12
01-FEB-12
01-MAR-12
01-APR-12
01-MAY-12
01-JUN-12
01-JUL-12
01-AUG-12
01-SEP-12
01-OCT-12
01-NOV-12
01-DEC-12


Generar todos los días del año:


SELECT 
    TO_CHAR( TO_DATE( TO_CHAR( SYSDATE, 'YYYY' )||'0101', 'YYYYMMDD' )-1+X , 
    'YYYYMMDD' ) dia FROM ( 
SELECT ROWNUM x /*+ INDEX( CBRA )*/ FROM DUAL CONNECT BY LEVEL<=366 )
 WHERE TO_CHAR( TO_DATE( TO_CHAR( SYSDATE, 'YYYY' )||'0101', 'YYYYMMDD' )-1+X, 
       'YYYY' ) = TO_CHAR( SYSDATE, 'YYYY' ) 
;

Resultado:

DIA
--------
20120101
20120102
20120103
20120104
...
20121225
20121226
20121227
20121228
20121229
20121230
20121231

366 rows selected.


Todos los días de otro año sin importar si es bisiesto o no, ejemplo 2011:


SELECT 
    TO_CHAR( TO_DATE( '20110101', 'YYYYMMDD' )-1+X , 'YYYYMMDD' 
           ) dia FROM ( 
SELECT ROWNUM x /*+ INDEX( CBRA )*/ FROM DUAL CONNECT BY LEVEL<=366 )
 WHERE TO_CHAR( TO_DATE( '20110101', 'YYYYMMDD' )-1+X, 'YYYY' ) = '2011'
;

Resultado:

DIA
--------
20110101
20110102
20110103
20110104
...
20111225
20111226
20111227
20111228
20111229
20111230
20111231

365 rows selected.


Generar Combinaciones en Binario de 4 bits. La uso bastante para generar casos de prueba en funciones/procedimientos:


SELECT c4.x-1 c4, c3.x-1 c3, c2.x-1 c2, c1.x-1 c1 FROM 
( SELECT ROWNUM x /*+ INDEX( CBRA )*/ FROM DUAL CONNECT BY LEVEL<=2 ) c1,
( SELECT ROWNUM x /*+ INDEX( CBRA )*/ FROM DUAL CONNECT BY LEVEL<=2 ) c2,
( SELECT ROWNUM x /*+ INDEX( CBRA )*/ FROM DUAL CONNECT BY LEVEL<=2 ) c3,
( SELECT ROWNUM x /*+ INDEX( CBRA )*/ FROM DUAL CONNECT BY LEVEL<=2 ) c4
;

Resultado:

        C4         C3         C2         C1
---------- ---------- ---------- ----------
         0          0          0          0
         0          0          0          1
         0          0          1          0
         0          0          1          1
         0          1          0          0
         0          1          0          1
         0          1          1          0
         0          1          1          1
         1          0          0          0
         1          0          0          1
         1          0          1          0
         1          0          1          1
         1          1          0          0
         1          1          0          1
         1          1          1          0
         1          1          1          1

16 rows selected.

Generar Combinaciones con otras tablas, por ejemplo Países en tabla "x" y tres letras A,B,C por cada país y por cada 2 sets:


SELECT c3.x c3, c2.x PAIS, CHR( 64+c1.x ) OP FROM 
( SELECT ROWNUM x /*+ INDEX( CBRA )*/ FROM DUAL CONNECT BY LEVEL<=3 ) c1,
( SELECT * FROM x /*+ INDEX( CBRA )*/ ) c2,
( SELECT ROWNUM x /*+ INDEX( CBRA )*/ FROM DUAL CONNECT BY LEVEL<=2 ) c3
;


Resultado:


        C3 PAIS       OP
---------- ---------- --
         1 Venezuela  A
         1 Venezuela  B
         1 Venezuela  C
         1 Panamá     A
         1 Panamá     B
         1 Panamá     C
         1 Chile      A
         1 Chile      B
         1 Chile      C
         1 Argentina  A
         1 Argentina  B
         1 Argentina  C
         1 España     A
         1 España     B
         1 España     C
         1 EEUU       A
         1 EEUU       B
         1 EEUU       C
         2 Venezuela  A
         2 Venezuela  B
         2 Venezuela  C
         2 Panamá     A
         2 Panamá     B
         2 Panamá     C
         2 Chile      A
         2 Chile      B
         2 Chile      C
         2 Argentina  A
         2 Argentina  B
         2 Argentina  C
         2 España     A
         2 España     B
         2 España     C
         2 EEUU       A
         2 EEUU       B
         2 EEUU       C

36 rows selected.
 

1 comment: