Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Generar Mes en Consulta

Estas en el tema de Generar Mes en Consulta en el foro de Oracle en Foros del Web. Buenas Noches. Necesito Generar una consulta que me arroje lo siguiente Vuelos 1 2 3 4 5 6 7 8 9 ... 31 ( dias ...
  #1 (permalink)  
Antiguo 11/02/2008, 22:35
 
Fecha de Ingreso: septiembre-2006
Mensajes: 6
Antigüedad: 17 años, 7 meses
Puntos: 0
Pregunta Generar Mes en Consulta

Buenas Noches.

Necesito Generar una consulta que me arroje lo siguiente

Vuelos 1 2 3 4 5 6 7 8 9 ... 31 ( dias del Mes )
LP-001 200 100 ETC
LP-002 300 10 ETC
.
.
.
TOTALES

Necesito que las cabeceeras se formen de acuerdo al mes y en la primera columna se forma de acuerdo a los vuelos de ese dia, los valores es el total de kilos de ese vuelo que salio el dia 1 del mes, del dia 2 del mes, etc

alguien me puede ayudar ??

Gracias
  #2 (permalink)  
Antiguo 12/02/2008, 07:41
 
Fecha de Ingreso: noviembre-2007
Ubicación: Argentina
Mensajes: 134
Antigüedad: 16 años, 5 meses
Puntos: 3
Re: Generar Mes en Consulta

Ok mi amigo Ricardo de Peru, esto es lo que te propongo, es un poco larga pero no conozco otra y tiene sus limitaciones, pero para consultas mensuales te va a funcionar bien.

No importa la cantidad de dias tenga el mes, el resultado del select sera de 31 columnas mas dos columnas mas, una indicando el vuelo y otra indicando el mes que se consulto, porque esta ultima columna, porque viendo las columnas no puede deducir de que mes estamos haciendo referencia.

Una condicion importante es que no puede mostrar mas de un mes, o la mitad de uno y la mitad del otro (aunque en realidad si puedes, pero corres el riesgo que el resultado no se interprete).

Este pequeño desarrollo se hizo con PL/SQL.

Primero creamos una tabla con valores ficticios para poder luego armar el select.
Código:
DROP TABLE RICARDO_PERU PURGE;

CREATE TABLE RICARDO_PERU
(
VUELO        VARCHAR2(20),
FECHA        DATE,
CANTIDAD     INTEGER
) TABLESPACE AUXILIAR PCTFREE 5 PCTUSED 95;

INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('01.01.2008','DD.MM.YYYY'), 10);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('02.01.2008','DD.MM.YYYY'), 20);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('03.01.2008','DD.MM.YYYY'), 30);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('04.01.2008','DD.MM.YYYY'), 40);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('05.01.2008','DD.MM.YYYY'), 50);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('06.01.2008','DD.MM.YYYY'), 60);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('07.01.2008','DD.MM.YYYY'), 70);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('08.01.2008','DD.MM.YYYY'), 80);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('09.01.2008','DD.MM.YYYY'), 90);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('10.01.2008','DD.MM.YYYY'), 11);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('11.01.2008','DD.MM.YYYY'), 12);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('12.01.2008','DD.MM.YYYY'), 13);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('13.01.2008','DD.MM.YYYY'), 14);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('14.01.2008','DD.MM.YYYY'), 15);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('15.01.2008','DD.MM.YYYY'), 33);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('16.01.2008','DD.MM.YYYY'), 34);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('17.01.2008','DD.MM.YYYY'), 35);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('18.01.2008','DD.MM.YYYY'), 43);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('19.01.2008','DD.MM.YYYY'), 47);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('20.01.2008','DD.MM.YYYY'), 49);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('21.01.2008','DD.MM.YYYY'), 40);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('22.01.2008','DD.MM.YYYY'), 14);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('23.01.2008','DD.MM.YYYY'), 15);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('24.01.2008','DD.MM.YYYY'), 50);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('25.01.2008','DD.MM.YYYY'), 62);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('26.01.2008','DD.MM.YYYY'), 60);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('27.01.2008','DD.MM.YYYY'), 18);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('28.01.2008','DD.MM.YYYY'), 85);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('29.01.2008','DD.MM.YYYY'), 17);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('30.01.2008','DD.MM.YYYY'), 95);
INSERT INTO RICARDO_PERU VALUES ('LP-001',TO_DATE('31.01.2008','DD.MM.YYYY'), 89);

INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('01.01.2008','DD.MM.YYYY'), 110);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('02.01.2008','DD.MM.YYYY'), 120);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('03.01.2008','DD.MM.YYYY'), 130);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('04.01.2008','DD.MM.YYYY'), 140);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('05.01.2008','DD.MM.YYYY'), 150);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('06.01.2008','DD.MM.YYYY'), 160);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('07.01.2008','DD.MM.YYYY'), 170);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('08.01.2008','DD.MM.YYYY'), 180);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('09.01.2008','DD.MM.YYYY'), 190);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('10.01.2008','DD.MM.YYYY'), 111);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('11.01.2008','DD.MM.YYYY'), 112);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('12.01.2008','DD.MM.YYYY'), 113);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('13.01.2008','DD.MM.YYYY'), 114);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('14.01.2008','DD.MM.YYYY'), 115);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('15.01.2008','DD.MM.YYYY'), 133);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('16.01.2008','DD.MM.YYYY'), 134);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('17.01.2008','DD.MM.YYYY'), 135);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('18.01.2008','DD.MM.YYYY'), 143);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('19.01.2008','DD.MM.YYYY'), 147);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('20.01.2008','DD.MM.YYYY'), 149);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('21.01.2008','DD.MM.YYYY'), 140);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('22.01.2008','DD.MM.YYYY'), 114);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('23.01.2008','DD.MM.YYYY'), 115);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('24.01.2008','DD.MM.YYYY'), 150);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('25.01.2008','DD.MM.YYYY'), 162);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('26.01.2008','DD.MM.YYYY'), 160);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('27.01.2008','DD.MM.YYYY'), 118);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('28.01.2008','DD.MM.YYYY'), 185);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('29.01.2008','DD.MM.YYYY'), 117);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('30.01.2008','DD.MM.YYYY'), 195);
INSERT INTO RICARDO_PERU VALUES ('LP-002',TO_DATE('31.01.2008','DD.MM.YYYY'), 189);

COMMIT;
  #3 (permalink)  
Antiguo 12/02/2008, 07:42
 
Fecha de Ingreso: noviembre-2007
Ubicación: Argentina
Mensajes: 134
Antigüedad: 16 años, 5 meses
Puntos: 3
Re: Generar Mes en Consulta

Una vez creada la tabla con valores para dos vuelos, armamos el select para mostrar los datos en columnas.

Código:
SELECT VUELO,
       MES,
       MAX(DIA_01) DIA_01,
       MAX(DIA_02) DIA_02,
       MAX(DIA_03) DIA_03,
       MAX(DIA_04) DIA_04,
       MAX(DIA_05) DIA_05,
       MAX(DIA_06) DIA_06,
       MAX(DIA_07) DIA_07,
       MAX(DIA_08) DIA_08,
       MAX(DIA_09) DIA_09,
       MAX(DIA_10) DIA_10,
       MAX(DIA_11) DIA_11,
       MAX(DIA_12) DIA_12,
       MAX(DIA_13) DIA_13,
       MAX(DIA_14) DIA_14,
       MAX(DIA_15) DIA_15,
       MAX(DIA_16) DIA_16,
       MAX(DIA_17) DIA_17,
       MAX(DIA_18) DIA_18,
       MAX(DIA_19) DIA_19,
       MAX(DIA_20) DIA_20,
       MAX(DIA_21) DIA_21,
       MAX(DIA_22) DIA_22,
       MAX(DIA_23) DIA_23,
       MAX(DIA_24) DIA_24,
       MAX(DIA_25) DIA_25,
       MAX(DIA_26) DIA_26,
       MAX(DIA_27) DIA_27,
       MAX(DIA_28) DIA_28,
       MAX(DIA_29) DIA_29,
       MAX(DIA_30) DIA_30,
       MAX(DIA_31) DIA_31
  FROM (
SELECT VUELO,
       TO_CHAR(TO_DATE('&1','DD.MM.YYYY'),'MONTH') MES,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY')     , CANTIDAD, NULL) DIA_01,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 01, CANTIDAD, NULL) DIA_02,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 02, CANTIDAD, NULL) DIA_03,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 03, CANTIDAD, NULL) DIA_04,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 04, CANTIDAD, NULL) DIA_05,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 05, CANTIDAD, NULL) DIA_06,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 06, CANTIDAD, NULL) DIA_07,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 07, CANTIDAD, NULL) DIA_08,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 08, CANTIDAD, NULL) DIA_09,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 09, CANTIDAD, NULL) DIA_10,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 10, CANTIDAD, NULL) DIA_11,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 11, CANTIDAD, NULL) DIA_12,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 12, CANTIDAD, NULL) DIA_13,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 13, CANTIDAD, NULL) DIA_14,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 14, CANTIDAD, NULL) DIA_15,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 15, CANTIDAD, NULL) DIA_16,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 16, CANTIDAD, NULL) DIA_17,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 17, CANTIDAD, NULL) DIA_18,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 18, CANTIDAD, NULL) DIA_19,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 19, CANTIDAD, NULL) DIA_20,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 20, CANTIDAD, NULL) DIA_21,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 21, CANTIDAD, NULL) DIA_22,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 22, CANTIDAD, NULL) DIA_23,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 23, CANTIDAD, NULL) DIA_24,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 24, CANTIDAD, NULL) DIA_25,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 25, CANTIDAD, NULL) DIA_26,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 26, CANTIDAD, NULL) DIA_27,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 27, CANTIDAD, NULL) DIA_28,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 28, CANTIDAD, NULL) DIA_29,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 29, CANTIDAD, NULL) DIA_30,
       DECODE(FECHA, TO_DATE('&1','DD.MM.YYYY') + 30, CANTIDAD, NULL) DIA_31
  FROM (
SELECT VUELO, FECHA, CANTIDAD
  FROM RICARDO_PERU
 WHERE FECHA BETWEEN TO_DATE('&1', 'DD.MM.YYYY')
                 AND ADD_MONTHS(TRUNC(TO_DATE('&1', 'DD.MM.YYYY'), 'MONTH'), 1) - 1
       )
       )
 GROUP BY VUELO, MES;
Fijate bien la clausula de la fecha en WHERE, ingresas una sola variable fecha, normalmente tiene que ser comienzo de mes (porque dijo normalmente, porque puedes poner otra fecha, y te mostrara los valores desde ese dia hasta que termine el mes.)
El ADD_MONTHS solamente calcula el ultimo dia del mes.
Ahora si fuera Febrero, las columnas de los dias 29 (si no fuera biciesto), 30 y 31 estarian vacias.

Use la funcion DECODE y no las tipicas funciones windowing LAG o LEAD, debido a que estas tiene un mayor consumo del block size, ademas el DECODE me da lo que necesito perfectamente.

Bueno Amigo, muchos exitos, cualquier duda avisa.

Sldo Atte, Mario.

Última edición por MarioHeredia; 12/02/2008 a las 07:43 Razón: Correcion de tipeo
  #4 (permalink)  
Antiguo 12/02/2008, 13:13
 
Fecha de Ingreso: septiembre-2006
Mensajes: 6
Antigüedad: 17 años, 7 meses
Puntos: 0
Re: Generar Mes en Consulta

Excelente !!!

Muchas Gracias

te debo un pollito a la brasa :D o cevichito
  #5 (permalink)  
Antiguo 18/02/2008, 07:39
 
Fecha de Ingreso: noviembre-2007
Ubicación: Argentina
Mensajes: 134
Antigüedad: 16 años, 5 meses
Puntos: 3
Re: Generar Mes en Consulta

El "cechivito" parece muy tentador...

Encantado amigo Ricardo, cuando pueda me hago un escaparate a Peru, yo llevo un vino mendocino de Argentina.

Saludos desde lo mas autral del Mundo. Mario.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:48.