Oracle - Máximo valor que depende de otro parametro

 
Vista:
sin imagen de perfil

Máximo valor que depende de otro parametro

Publicado por Diego (7 intervenciones) el 14/07/2017 14:59:28
Buena tarde, tengo la siguiente consulta:

1
2
3
4
SELECT e.NUMDOCUMENTO AS "NUM. DOCUMENTO",e.NOMBRE1||' '||TRIM(e.NOMBRE2)||' '||e.APELLIDO1||' '||e.APELLIDO2 "NOMBRE",fe.FECHAAFILIACION,ft.FONDOTIPO,t.TERCERO
    FROM EMPLEADO e,VINCULACION v,VINCULACIONDET vd,FONDOXEMPLEADO fe,FONDOTIPO ft,Terceros t
    WHERE e.CODEMPLEADO = v.CODEMPLEADO AND v.NUMVINCULACION = vd.NUMVINCULACION AND vd.TIPOREG = 2 AND v.CODVINCULACIONESTADO = 1 AND e.CODEMPLEADO = fe.CODEMPLEADO AND fe.CODFONDOTIPO = ft.CODFONDOTIPO AND fe.CODFONDO = t.CODTERCERO AND fe.FECHAAFILIACION = (SELECT MAX(fe2.FECHAAFILIACION) FROM FONDOXEMPLEADO_TPP fe2 WHERE e.CODEMPLEADO = fe2.CODEMPLEADO)
    ORDER BY e.CODEMPLEADO ASC

Lo que me trae el siguiente resultado:

1
2
3
4
5
2589645 ;PEDRO PEREZ ;10/24/2014 00:00:00 ;Salud ;1 ;Coopsalud
    2589645 ;PEDRO PEREZ ;01/01/2016 00:00:00 ;Cesantias ;9 ;Ahoro seguro
    2589645 ;PEDRO PEREZ ;10/24/2014 00:00:00 ;Caja de Compensacion Familiar ;5 ;Familia integral
    2589645 ;PEDRO PEREZ ;10/24/2014 00:00:00 ;Cesantias ;9 ;Servingreso
    2589645 ;PEDRO PEREZ ;10/24/2014 00:00:00 ;Pension ;2 ;Servingreso
la situación que quiero solucionar es la siguiente:
1
2
2589645 ;PEDRO PEREZ ;01/01/2016 00:00:00 ;Cesantias ;9 ;Ahoro seguro
    2589645 ;PEDRO PEREZ ;10/24/2014 00:00:00 ;Cesantias ;9 ;Servingreso
necesito que la consulta traiga del mismo tipo (ejemplo el 9) el registro con la fecha mas alta que en esta caso seria:
1
2589645 ;PEDRO PEREZ ;01/01/2016 00:00:00 ;Cesantias ;9 ;Ahoro seguro
por lo que el resultado final sería:

1
2
3
4
2589645 ;PEDRO PEREZ ;10/24/2014 00:00:00 ;Salud ;1 ;Coopsalud
    2589645 ;PEDRO PEREZ ;01/01/2016 00:00:00 ;Cesantias ;9 ;Ahoro seguro
    2589645 ;PEDRO PEREZ ;10/24/2014 00:00:00 ;Caja de Compensacion Familiar ;5 ;Familia integral
    2589645 ;PEDRO PEREZ ;10/24/2014 00:00:00 ;Pension ;2 ;Servingreso
estaba intentando seleccionar la máxima fecha con:
1
WHERE e.CODEMPLEADO = v.CODEMPLEADO AND v.NUMVINCULACION = vd.NUMVINCULACION AND vd.TIPOREG = 2 AND v.CODVINCULACIONESTADO = 1 AND e.CODEMPLEADO = fe.CODEMPLEADO AND fe.CODFONDOTIPO = ft.CODFONDOTIPO AND fe.CODFONDO = t.CODTERCERO AND fe.FECHAAFILIACION = (SELECT MAX(fe2.FECHAAFILIACION) FROM FONDOXEMPLEADO fe2 WHERE e.CODEMPLEADO = fe2.CODEMPLEADO)

pero de los 6 registros sólo queda:
1
2589645 ;PEDRO PEREZ ;01/01/2016 00:00:00 ;Cesantias ;9 ;Ahoro seguro
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

Máximo valor que depende de otro parametro

Publicado por Rafael (328 intervenciones) el 21/07/2017 09:33:31
Hola:

A veces la solución mas simple es la mejor solución...
Veamos lo primero que necesitas segun tu enunciado es conocer la maxima fecha por empleado, fondo y fondo tipo... o al menos asi lo he entendido yo ... y en base a eso traer datos luego entonces la informacion parte de aqui:
1
2
3
4
5
6
7
8
SELECT CODEMPLEADO
     , CODFONDOTIPO
     , CODFONDO
     , MAX(FECHAAFILIACION) FECHAAFILIACION
FROM   FONDOXEMPLEADO
GROUP  BY CODEMPLEADO
     , CODFONDOTIPO
     , CODFONDO

Ahora esto lo tienes que ligar al resto de la información...
Al calce de esto te comento, el poner mas claras las queries o consultas no solo te ayuda a encontrar las cosas si no a los demas nos ayuda a ayudarte mejor....

Para efectos del optimizador y motor de la base de datos le da lo mismo que hagas los JOIN implicitos como los escribes como si los haces declarados.... para fines de analisis es mas facil saber si algo pertenece al JOIN o es un filtro

Dicho lo cual te propongo pruebas una query asi ...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT e.NUMDOCUMENTO AS "NUM. DOCUMENTO"
     , e.NOMBRE1||' '||TRIM(e.NOMBRE2)||' '||e.APELLIDO1||' '||e.APELLIDO2 "NOMBRE"
     , fe.FECHAAFILIACION
     , ft.FONDOTIPO
     , t.TERCERO
FROM   EMPLEADO e
       JOIN VINCULACION v on e.CODEMPLEADO = v.CODEMPLEADO
       JOIN VINCULACIONDET vd on v.NUMVINCULACION = vd.NUMVINCULACION
       JOIN (SELECT CODEMPLEADO
                  , CODFONDOTIPO
                  , CODFONDO
                  , MAX(FECHAAFILIACION) FECHAAFILIACION
             FROM   FONDOXEMPLEADO
             GROUP  BY CODEMPLEADO
                  , CODFONDOTIPO
                  , CODFONDO) fe ON     e.CODEMPLEADO = fe.CODEMPLEADO
       JOIN FONDOTIPO ft ON fe.CODFONDOTIPO = ft.CODFONDOTIPO
       JOIN Terceros t ON fe.CODFONDO = t.CODTERCERO
WHERE vd.TIPOREG = 2
AND   v.CODVINCULACIONESTADO = 1
ORDER BY e.CODEMPLEADO ASC

De este modo YA estas limitando los datos al maximo de la FECHAAFILIACION y partiendolo como te entendi por empleado, fondo y fondo tipo....

Espero esto te ayude...
Saludos

pd: Si te sirve un +1 nunca me viene mal...
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