SQL - Buscar Dato en Tabla y seleccionar fecha mayor.

 
Vista:
sin imagen de perfil
Val: 16
Ha disminuido su posición en 3 puestos en SQL (en relación al último mes)
Gráfica de SQL

Buscar Dato en Tabla y seleccionar fecha mayor.

Publicado por roberto (20 intervenciones) el 02/12/2014 22:16:27
Hola chicos, traigo el siguiente dilema, tengo el siguiente código el cual detallo:

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
SELECT DISTINCT
    A1.ISAP_CEMPRESA AS ISAPRE,
    A1.CRED_XAFIL_EMP AS TIPO,
    A1.CRED_NRUT AS AFI_RUT,
    A1.CRED_NOMBRE_RAZON_SOCIAL AS AFI_NOMBRE,
    A3.LOCA_CREGION,
    A4.LOCA_TNOMBRE_COMUNA,
    A4.LOCA_TNOMBRE_CIUDAD,
    A3.AFIL_TCALLE,
    A3.AFIL_TNUMERO,
    A3.AFIL_TFONO1,
    A3.AFIL_TFONO2,
    A3.AFIL_TFONO_CELULAR,
    A3.AFIL_TEMAIL,
    A5.TP_Tramo,
    A5.NICHO,
    A6.DOLE_XINGRESO
     FROM CRED_LINEA_CREDITO A1
    JOIN MVLC_MOV_LIN_CRED A2
    ON A1.CRED_CLIN_CRED=A2.CRED_CLIN_CRED
     JOIN AFILIADOS A3
    ON A1.CRED_NRUT=A3.AFIL_NRUT
    JOIN LOCA_LOCALIDAD A4
    ON  A3.LOCA_CREGION=A4.LOCA_CREGION and A3.LOCA_CLOCALIDAD=A4.LOCA_CLOCALIDAD
    JOIN MODELO_RENTABILIDAD_LIQ A5
    ON A1.CRED_NRUT=A5.RUT AND A5.FECHA BETWEEN '201404' AND '201410'
    JOIN DOLE A6 ON A1.CRED_NRUT=A6.AFIL_NRUT AND DOLE_XINGRESO ='MT'
    WHERE  A2.MVLC_FEMISION_DOC
    BETWEEN '01/11/2014'
    and '30/11/2014' and A1.CRED_XAFIL_EMP='U'
    and A1.ISAP_CEMPRESA ='B' and A3.ISAP_CEMPRESA ='B'
    and TIPM_CTIPO_MOV NOT IN (0,308,11,14)

Mi consulta se basa en lo que deje en negrita:

AND A5.FECHA BETWEEN '201404' AND '201410'

1.- En esta parte coloco un rango de periodos, pero lo que busco es seleccionar el mas grande de la columna FECHA, es decir si un CRED_NRUT en la tabla tiene 4 fechas que seleccione las mas nueva(grande)

JOIN DOLE A6 ON A1.CRED_NRUT=A6.AFIL_NRUT AND DOLE_XINGRESO ='MT'

2.- Aca busca todos los CRED_NRUT que tienen el estado 'MT' , pero me saca los que no tienen esa condición, lo que busco es que me deje los que tienen este requisito y los que no lo tienen............. OBS los CRED_NRUT tienen mas de un estado el MT no es el unico estado.





Saluda,


Roberto Soto G.
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: 16
Ha disminuido su posición en 3 puestos en SQL (en relación al último mes)
Gráfica de SQL

Buscar Dato en Tabla y seleccionar fecha mayor.

Publicado por roberto (20 intervenciones) el 02/12/2014 22:46:13
Quizas fue muy enrredado mi duda, coloco un Ejemplo practico:

Tabla R1

RUT----OB
1---------B
2---------T
3---------T


Tabla R2

RUT----HHHH
1---------PT
1---------MB
2--------BN
3--------MT

Tabla R3

RUT----AAAA-----PPPP
1---------2014-------BIEN
1---------2013-------MALO
2--------2012-------BMAS
3--------2052-------BIPOR

El resultado seria este:

RUT----OB---PPPP--HHHH
1---------B-----BIEN--- (null) (El resultado BIEN es seleccionado porq es el mayor de la columna AAAA segun el RUT:1)
2---------T-----BMAS--(null)
3---------T-----BIPOR--(MT)(Aca busco si alguno de los RUT tenia la palabra MT, el que no lo dejaba sin dato(null)
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: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Buscar Dato en Tabla y seleccionar fecha mayor.

Publicado por leonardo_josue (1173 intervenciones) el 09/12/2014 17:29:52
Hola Roberto:

Tu consulta en realidad es simple, lo único que tienes que hacer es aplicar la técnica de "Divide y vencerás" es decir, hacer las consultas por partes... vayamos por partes, con tus datos tenemos lo siguiente:

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
mysql> SELECT * FROM tabla_r1;
+------+------+
| RUT  | OB   |
+------+------+
|    1 | B    |
|    2 | T    |
|    3 | T    |
+------+------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla_r2;
+------+------+
| RUT  | HHHH |
+------+------+
|    1 | PT   |
|    1 | MB   |
|    2 | BN   |
|    3 | MT   |
+------+------+
4 rows in set (0.01 sec)
 
mysql> SELECT * FROM tabla_r3;
+------+------+-------+
| RUT  | AAAA | PPPP  |
+------+------+-------+
|    1 | 2014 | BIEN  |
|    1 | 2013 | MALO  |
|    2 | 2012 | BMAS  |
|    3 | 2052 | BIPOR |
+------+------+-------+
4 rows in set (0.00 sec)

1. Para obtener el máximo valor de un RUT en tu tabla R3, primero tienes que determinar qué aaaa es el máximo para cada rut, esto lo obtienes así:

1
2
3
4
5
6
7
8
9
mysql> SELECT rut, MAX(aaaa) FROM tabla_r3 GROUP BY rut;
+------+-----------+
| rut  | MAX(aaaa) |
+------+-----------+
|    1 |      2014 |
|    2 |      2012 |
|    3 |      2052 |
+------+-----------+
3 rows in set (0.00 sec)

Ahora, puedes utilizar esta subconsulta, para filtrar los datos, es decir, hacer algo como eso:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT r1.rut, r1.ob, r3.pppp
    -> FROM tabla_r1 r1
    -> INNER JOIN tabla_r3 r3 ON r1.rut = r3.rut
    -> INNER JOIN ( SELECT rut, MAX(aaaa) max_aaaa
    ->              FROM tabla_r3
    ->              GROUP BY rut) r3_max ON r3.rut = r3_max.rut AND
    ->                                      r3.aaaa = r3_max.max_aaaa;
+------+------+-------+
| rut  | ob   | pppp  |
+------+------+-------+
|    1 | B    | BIEN  |
|    2 | T    | BMAS  |
|    3 | T    | BIPOR |
+------+------+-------+
3 rows in set (0.00 sec)

Observa que en existen dos INNER JOIN's... el primero se hace de manera "normal" entre las tablas R1 y R3... el segundo INNER JOIN corresponde a la subconsulta para obtener el máximo... en la cláusula ON se coloca no sólo el campo RUT, sino también el campo AAAA con el correspondiente MAX_AAAA, de esta manera se filtran sólo los años máximos para cada RUT.

2. Para la segunda columna sólo tienes que hacer un LEFT JOIN en lugar de un INNER JOIN, es decir, algo como esto:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT r1.rut, r1.ob, r2.hhhh
    -> FROM tabla_r1 r1
    -> LEFT JOIN tabla_r2 r2 ON r1.rut = r2.rut AND r2.hhhh = 'MT';
+------+------+------+
| rut  | ob   | hhhh |
+------+------+------+
|    1 | B    | NULL |
|    2 | T    | NULL |
|    3 | T    | MT   |
+------+------+------+
3 rows in set (0.00 sec)

Lo único que faltaría es juntar estas dos consultas, para que obtengas las dos columnas en la misma consulta, haz la prueba y nos comentas. Si continuas con problemas, postea lo que intentaste hacer y con gusto te ayudamos a corregir los errores.

Saludos
Leo.
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