Oracle - Consulta a una misma Vista con Rangos de periodos diferentes

 
Vista:
Imágen de perfil de Sergio
Val: 31
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Consulta a una misma Vista con Rangos de periodos diferentes

Publicado por Sergio (8 intervenciones) el 27/03/2018 17:48:55
Buenos días Comunidad,

Quisiera una ayuda en los siguiente: Estoy trabajando en una base de datos Oracle 11g, Tengo una vista que trae los datos de Lotes, cantidades, etc, (describo la vista):

SQL> desc v_infprod
Name Null? Type
------------------------------- -------- ----
CENTRO_COSTO VARCHAR2(4000)
FINCA VARCHAR2(4000)
C_COS NOT NULL VARCHAR2(12)
PERIODO VARCHAR2(6)
MATERIAL_GENETICO VARCHAR2(20)
AÑO_DE_SIEMBRA NUMBER(4)
PESO_RACIMOS NUMBER
RACIMOS NUMBER
TON_HA NUMBER
HA_NETA NUMBER
PALMAS NUMBER
TONELADAS NUMBER

Necesito hacer un select que me muestre los datos siguientes y sus respectivos análisis (diferencias Absolutas y Relativas %).

Centro_Costo - Material_Genetico - Palmas - Ha_Neta - Rango de Meses (1) - Rango de Meses (2) - Diferencia - Diferencia Porcentual

Algo como esto:

C_costo Mat Gen Palmas Has "Rango 1 Toneladas" "Rango 2 Toneladas" Dif. Abs. Dif. Rel. (%)
01-87 Murgas Papua 1.391 9,73 282,36 194,70 -87,66 -31,05%
02-87 Murgas Papua 2.291 16,02 453,53 324,53 -129,00 -28,44%
03-87 Murgas Papua 2.308 16,14 457,69 329,65 -128,04 -27,98%
04-87 Murgas Papua 2.289 16,01 452,95 336,36 -116,59 -25,74%
05-87 Murgas Papua 2.155 15,07 452,89 325,19 -127,70 -28,20%

Siempre se comparan rangos de 12 meses, por ejemplo: de marzo-2016 a febrero-2017 comparado con marzo-2017 a febrero-2018.

¿Quien me puede ayudar con el query?.
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
sin imagen de perfil
Val: 499
Oro
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Consulta a una misma Vista con Rangos de periodos diferentes

Publicado por Rafael (328 intervenciones) el 28/03/2018 16:13:31
Y que llevas???
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
Imágen de perfil de Sergio
Val: 31
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Consulta a una misma Vista con Rangos de periodos diferentes

Publicado por Sergio (8 intervenciones) el 28/03/2018 21:22:44
este pivot me trae por años los datos, me faltaría sacar las diferencias de las toneladas y ver como hacer para que me salga por rango de periodos en vez de año. (feb-16 a mar-2017 vs feb-17 a mar-18 - por ejemplo.)

1
2
3
4
5
6
7
select * from (
select finca, lote, Año, sum(TONELADAS) TONELADAS
from v_infprod
group by finca, lote, Año
)
pivot (sum(TONELADAS) for Año in (2016,2017))
ORDER BY finca, lote;

1
2
3
4
5
6
7
FINCA           LOTE                2016-TON          2017-TON
FINCA MONTERIA	L. 01-87 monteria	282,363	          194,7
FINCA MONTERIA	L. 02-87 monteria	453,528	          324,529
FINCA MONTERIA	L. 03-87 monteria	457,688	          329,649
FINCA MONTERIA	L. 04-87 monteria	452,949	          336,358
FINCA MONTERIA	L. 05-87 monteria	452,889	          325,192
FINCA MONTERIA	L. 06-87 monteria	513,532	          398,297

Quedo atento.
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
Imágen de perfil de Sergio
Val: 31
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Consulta a una misma Vista con Rangos de periodos diferentes

Publicado por Sergio (8 intervenciones) el 02/04/2018 17:25:52
¿quién me puede ayudar?

Gracias....
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
sin imagen de perfil
Val: 499
Oro
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Consulta a una misma Vista con Rangos de periodos diferentes

Publicado por Rafael (328 intervenciones) el 03/04/2018 14:15:38
Esta bien ...
Te ayudare...

De acuerdo a los campos que proporcionas he de suponer que si ahora estas agrupando por AÑO y pivoteando dos años...
Has pensado en modificar para agrupar por RANGO de PERIODOS y pivotear dos RANGOS de periodos

Pense estabas en este punto o similar...

Supongo que los periodos al ser de 6 caractares son en formato "mmm-yy" ...
algo muy malo para hacer periodos por fecha por que te costara escribir mucho ya que si quisieras rangos de tres meses o mas hay que teclear todos los meses que necesites y agrupar...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT *
FROM   (SELECT FINCA
             , LOTE
             , CASE WHEN PERIODO IN ('feb-16', 'mar-16') THEN 'feb-16 A mar-16'
                    ELSE 'feb-17 A mar-17' END RANGO
             , SUM(TONELADAS) TONELADAS
        FROM   V_INFPROD
        WHERE  PERIODO IN ('feb-16', 'mar-16', 'feb-17', 'mar-17')
        GROUP  BY FINCA
             , LOTE
             , CASE WHEN PERIODO IN ('feb-16', 'mar-16') THEN 'feb-16 A mar-16'
                    ELSE 'feb-17 A mar-17' END)
PIVOT  (SUM(TONELADAS) FOR RANGO IN ('feb-16 A mar-16','feb-17 A mar-17'))
ORDER BY FINCA, LOTE;

Si todas mis suposiciones son ciertas este codigo te lo tiene que resolver...

Yo modificaria la vista a dejar en lugar de periodo un mes numerico... otra cosa ... tu query o la descripcion de la tabla estan mal
NO existe el campo AÑO si que existe AÑO_DE_SIEMBRA....

Ahora ese es otro error enorme usar caracteres especiales en nombres de campos o tablas, a la larga ocacionan problemas.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Sergio
Val: 31
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Consulta a una misma Vista con Rangos de periodos diferentes

Publicado por Sergio (8 intervenciones) el 03/04/2018 21:34:59
Hola Rafael,

Tienes razón el desc de la vista fue anterior a la modificación que le hice para crear los campos ANO Y MES. Siguiendo tus sugerencias modifiqué el nombre de los campos con caracteres especiales quedando así como sigue la vista:

DESC v_infprod
Nombre Nulo Tipo
----------------- -------- --------------
LOTE VARCHAR2(4000)
FINCA VARCHAR2(4000)
C_COS NOT NULL VARCHAR2(12)
YEAR VARCHAR2(4)
MES VARCHAR2(2)
PERIODO VARCHAR2(6)
MATERIAL_GENETICO VARCHAR2(20)
ANO_DE_SIEMBRA NUMBER(4)
PESO_RACIMOS NUMBER
RACIMOS NUMBER
TON_HA NUMBER
HA_NETA NUMBER
PALMAS NUMBER
TONELADAS NUMBER

No entiendo aun lo del Rango de periodos. Te reitero que debo comparar un rango de 12 meses o periodos en este caso. El formato de periodo es yyyymm.

Siempre comparo los últimos 12 meses contra los mismos 12 meses el año inmediatamente anterior. por ejemplo:

rango1 201603 hasta 201702 (12 meses)
rango2 201703 hasta 201802 (12 meses).
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
sin imagen de perfil
Val: 499
Oro
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Consulta a una misma Vista con Rangos de periodos diferentes

Publicado por Rafael (328 intervenciones) el 05/04/2018 12:47:22
Sergio :

Y que has intentado ????

Bueno a ver si explicando lo que hago en el query vez cual es la idea ...

Con la actualizacion de la vista...
1. Necesitas recuperar la informacion que comprende ambos rangos
1
WHERE  PERIODO >= '201603' AND PERIODO <= '201802'
Verdad???

2. Necesitas totalizar SEPARANDO, para el rango 1 y para el rango 2
Lo hare con el pivot pero hay una forma de hacerlo directamente SIN el pivot. (Espero que la puedas deducir)

Luego para separa utilizaras un CASE que le diga a que RANGO pertenene
Has dicho que del 201603 al 201702 son del rango 1 y el resto sera rango2
1
2
CASE WHEN PERIODO BETWEEN  '201603' AND  '201702'  THEN 'rango1'
                    ELSE 'rango2' END RANGO

Y hay que agrupar por FINCA, LOTE y RANGO
1
2
3
4
GROUP  BY FINCA
             , LOTE
             , CASE WHEN PERIODO BETWEEN  '201603' AND  '201702'  THEN 'rango1'
                    ELSE 'rango2' END RANGO

Lo juntas todo ...

1
2
3
4
5
6
7
8
9
10
11
SELECT FINCA
             , LOTE
             , CASE WHEN PERIODO BETWEEN  '201603' AND  '201702'  THEN 'rango1'
                    ELSE 'rango2' END RANGO
             , SUM(TONELADAS) TONELADAS
        FROM   V_INFPROD
WHERE  PERIODO >= '201603' AND PERIODO <= '201803'
GROUP  BY FINCA
             , LOTE
             , CASE WHEN PERIODO BETWEEN  '201603' AND  '201702'  THEN 'rango1'
                    ELSE 'rango2' END RANGO

Ahora hay que usar el PIVOT!!!
Creo lo puedes inferir NO ????

Ahora bien te dije que hay un modo de hacer lo mismo en un solo paso sin usar el PIVOT....
Piensa que puedes poner el CASE en casi cualquier parte ....

Saludos

Pd. Cuando ayudamos aqui a que resuelvan sus dudas lo menos que esperamos es un +1 si en algo te sirve nuestras recomendaciones.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Sergio
Val: 31
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Consulta a una misma Vista con Rangos de periodos diferentes

Publicado por Sergio (8 intervenciones) el 05/04/2018 16:24:32
Gracias Rafael,

Me han sido de gran ayuda tus aportes. Ya tengo una mayor visión del objetivo de las consultas que requiero.

No sabia lo de las calificaciones para las recomendaciones por que apenas me uni la semana anterior. Lo tendré en cuenta en lo sucesivo.

Saludos y Bendiciones.

+1
+1
+1
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