Oracle - MOSTRAR ULTIMO MES REPORTADO

   
Vista:

MOSTRAR ULTIMO MES REPORTADO

Publicado por Miguel (2 intervenciones) el 26/10/2015 17:29:51
Hola, necesito de su ayuda, necesito mostrar el ultimo mes que tenga informacion en un reporte. Este es mi codigo

SELECT * FROM(
SELECT GT.IDUBIGEO, UB.DEPARTAMENTO, UB.PROVINCIA, UB.DISTRITO, UB.CCPP,GT.ANIO, GP.DESCRIPCION,
GT.CANTTUP,GT.MES AS MES
FROM GEN_TRAFICO_TUP GT
INNER JOIN CMN_UBIGEO UB
ON UB.IDUBIGEO = GT.IDUBIGEO
LEFT JOIN GEN_PROYECTO_SUPERVISION GP
ON GP.IDPROYSUPERVISION = GT.IDPROYSUPERVISION
)
PIVOT
(
MAX(CANTTUP)
FOR MES IN (1 AS ENERO,2 AS FEBRERO,3 AS MARZO,4 AS ABRIL,5 AS MAYO,6 AS JUNIO,7 AS JULIO,8 AS AGOSTO,
9 AS SETIEMBRE,10 AS OCTUBRE,11 AS NOVIEMBRE,12 AS DICIEMBRE)
)

reporte



en la imagen que estoy adjuntando es el resultado del codigo, yo quiero mostrar en una columna la cantidad del ultimo mes que se reporto, en el caso del primer registro me mostraria el 8 porque es la cantidad de telefonos que se reporto en el mes de octubre. Si solo he reportado hasta mayo me mostraria la cantidad de mayo..

Si alguien me pudiera ayudar estaria muy agradecido.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

MOSTRAR ULTIMO MES REPORTADO

Publicado por Rafael (178 intervenciones) el 27/10/2015 11:35:50
Hola Miguel:

Es dificil decirte como corregir directamente el query por que podria dejar algun error...
Para lo cual me planteo un ejemplo alternativo ...

Dada una tabla asi:
1
2
3
4
5
6
7
8
CREATE TABLE TMP_TEST
(
  ID     INTEGER                                NOT NULL,
  DEPTO  VARCHAR2(15 CHAR)                      NOT NULL,
  ANIO   INTEGER                                NOT NULL,
  MES    INTEGER                                NOT NULL,
  CANT   NUMBER                                 NOT NULL
);

Con los siguientes registros:
1
2
3
4
5
6
Insert into TMP_TEST (ID, DEPTO, ANIO, MES, CANT) VALUES (1, 'DEPTO 1', 2015, 1, 8);
Insert into TMP_TEST (ID, DEPTO, ANIO, MES, CANT) VALUES (2, 'DEPTO 1', 2015, 4, 10);
Insert into TMP_TEST (ID, DEPTO, ANIO, MES, CANT) VALUES (3, 'DEPTO 1', 2015, 8, 6);
Insert into TMP_TEST (ID, DEPTO, ANIO, MES, CANT) VALUES (4, 'DEPTO 2', 2015, 3, 5);
Insert into TMP_TEST (ID, DEPTO, ANIO, MES, CANT) VALUES (5, 'DEPTO 2', 2015, 7, 14);
Insert into TMP_TEST (ID, DEPTO, ANIO, MES, CANT) VALUES (6, 'DEPTO 2', 2015, 12, 8);

Podemos armar el query tal que asi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
SELECT *
FROM   (
        SELECT DEPTO
             , ANIO
             , DECODE (QA.ULT_MES, 1, 'ENERO', 2, 'FEBRERO', 3, 'MARZO',
                                   4, 'ABRIL', 5, 'MAYO', 6, 'JUNIO',
                                   7, 'JULIO', 8, 'AGOSTO', 9, 'SETIEMBRE',
                                   10, 'OCTUBRE', 11, 'NOVIEMBRE', 12, 'DICIEMBRE')
               AS ULT_MES
             , (SELECT CANT
                FROM   TMP_TEST
                WHERE  DEPTO = QA.DEPTO
                AND    MES   = QA.ULT_MES) AS ULT_MES_CANT
             , MES
             , CANT
        FROM   (SELECT DEPTO
                     , ANIO
                     , MES
                     , CANT
                     , MAX(MES) OVER (PARTITION BY DEPTO) ULT_MES
                FROM   TMP_TEST) QA)
PIVOT  (
        MAX (CANT)
        FOR MES IN (1 AS ENERO, 2 AS FEBRERO, 3 AS MARZO,
                    4 AS ABRIL, 5 AS MAYO, 6 AS JUNIO,
                    7 AS JULIO, 8 AS AGOSTO, 9 AS SETIEMBRE,
                    10 AS OCTUBRE,11 AS NOVIEMBRE,12 AS DICIEMBRE)
       )
ORDER BY 1, 2, 3

Obteniendo el resultado siguiente:
Imagen

Que entiendo es lo que buscas...

Ahora bien para tu query probablemente funcione algo asi...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
SELECT *
FROM   (
        SELECT GT.IDUBIGEO
             , UB.DEPARTAMENTO
             , UB.PROVINCIA
             , UB.DISTRITO
             , UB.CCPP
             , GT.ANIO
             , GP.DESCRIPCION
             , DECODE (GT.ULT_MES, 1, 'ENERO', 2, 'FEBRERO', 3, 'MARZO',
                                   4, 'ABRIL', 5, 'MAYO', 6, 'JUNIO',
                                   7, 'JULIO', 8, 'AGOSTO', 9, 'SETIEMBRE',
                                   10, 'OCTUBRE', 11, 'NOVIEMBRE', 12, 'DICIEMBRE')
               AS ULT_MES
             , (SELECT CANTTUP
                FROM   GEN_TRAFICO_TUP
                WHERE  IDUBIGEO = GT.IDUBIGEO
                AND    MES      = GT.ULT_MES) AS ULT_MES_CANT
             , GT.CANTTUP
             , GT.MES AS MES
        FROM   (SELECT IDUBIGEO
                     , ANIO
                     , DESCRIPCION
                     , CANTTUP
                     , MES
                     , MAX(MES) OVER (PARTITION BY IDUBIGEO) ULT_MES
                FROM   GEN_TRAFICO_TUP ) GT
               INNER JOIN CMN_UBIGEO UB
                  ON UB.IDUBIGEO = GT.IDUBIGEO
               LEFT JOIN GEN_PROYECTO_SUPERVISION GP
                  ON GP.IDPROYSUPERVISION = GT.IDPROYSUPERVISION
        )
PIVOT   (
         MAX(CANTTUP)
         FOR MES IN (1 AS ENERO, 2 AS FEBRERO, 3 AS MARZO,
                     4 AS ABRIL, 5 AS MAYO, 6 AS JUNIO,
                     7 AS JULIO, 8 AS AGOSTO, 9 AS SETIEMBRE,
                     10 AS OCTUBRE,11 AS NOVIEMBRE,12 AS DICIEMBRE)
        )

Me es imposible corroborar si funcionara o no pero estoy casi seguro de que si, dependera si tienes un solo registro por mes...

Como sea el concepto seguro te ayuda.

Saludos.

Pd. Si esto te sirve a mi me sirve el +1 que le des a mi respuesta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar