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

Maximo valor Mysql

Estas en el tema de Maximo valor Mysql en el foro de Mysql en Foros del Web. Buenas tardes, Tengo un problema y no consigo dar con la solución. Os pongo en situación: Tabla: FechaControl Columnas: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original ...
  #1 (permalink)  
Antiguo 23/03/2017, 10:36
 
Fecha de Ingreso: marzo-2015
Mensajes: 15
Antigüedad: 4 años, 7 meses
Puntos: 0
Maximo valor Mysql

Buenas tardes,

Tengo un problema y no consigo dar con la solución. Os pongo en situación:

Tabla: FechaControl

Columnas:
Código SQL:
Ver original
  1. |   Estado   | codigoproyecto | vercodigoproyecto |       fecha       |
  2.  
  3.    aceptado              18                        0                    06-05-2016
  4.     anulado               18                        1                    10-09-2016
  5.     borrado               18                        2                    01-03-2017
  6.    aceptado              19                        0                    09-04-2017

El dato que da la pagina es el año.

Lo que yo quiero que depende le año que se elija te de como resultado de todos los codigos de proyectos el ultimo correspondiente a ese año.
Por ejemplo, si elijo 2016 solo debería de darme como resultado el:
Código SQL:
Ver original
  1. anulado               18                        1                    10-09-2016

Y como segundo ejemplo si elijo 2017 me daría como resultado:
Código SQL:
Ver original
  1. borrado               18                        2                    01-03-2017
  2.    aceptado              19                        0                    09-04-2017

Otra cosa que también me gustaría que incluyese es que agrupara por estado. En el ejemplo de 2016 me diría que hay 1 anulado.

En el ejemplo de 2017 me diría de existe 1 borrado y 1 aceptado.

He probado varias consultas y ninguna me da lo que quiero. Las dejo aqui:
Código SQL:
Ver original
  1. SELECT estado, COUNT(estado) AS total FROM `FechaControl` WHERE `vercodigoproyecto`= (SELECT MAX(vercodigoproyecto) FROM `FechaControl` WHERE YEAR(fecha)='2016') GROUP BY `estado`

Estoy un poco perdido y agradecería que alguien me echara una mano.
Si necesitáis cualquier dato avisar.
Saludos y gracias.

Última edición por gnzsoloyo; 24/03/2017 a las 17:03
  #2 (permalink)  
Antiguo 23/03/2017, 11:45
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.404
Antigüedad: 13 años, 2 meses
Puntos: 774
Respuesta: Maximo valor Mysql

Porque 2016 da 1 resultado y 2017 da 2? te estas basando en el estado?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 23/03/2017, 13:22
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 547
Antigüedad: 6 años, 4 meses
Puntos: 46
Respuesta: Maximo valor Mysql

Código SQL:
Ver original
  1. ORDER BY fecha DESC LIMIT 1

Digo tal vez si lo ordenas por el campo fecha de manera descendente y pones un limite de 1, igual que libras ni idea porque 2016 solo da un resultado y 2017 2
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #4 (permalink)  
Antiguo 23/03/2017, 13:49
 
Fecha de Ingreso: octubre-2006
Mensajes: 6
Antigüedad: 13 años
Puntos: 0
Respuesta: Maximo valor Mysql

Por este motivo salen 2 en 2017

SELECT estado, count(estado) as total from `FechaControl` where `vercodigoproyecto`= (SELECT MAX(vercodigoproyecto) from `FechaControl` WHERE YEAR(fecha)='2016') group by `estado`
  #5 (permalink)  
Antiguo 23/03/2017, 13:51
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.404
Antigüedad: 13 años, 2 meses
Puntos: 774
Respuesta: Maximo valor Mysql

Si te fijas hay 2 registros con aceptado, pero esos 2 uno es del 2016 y otro es del 2017, aqui el que deberia de responder es el creador de la pregunta ya que el tiene los datos y la logica de que es lo que necesita
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #6 (permalink)  
Antiguo 23/03/2017, 17:54
 
Fecha de Ingreso: marzo-2015
Mensajes: 15
Antigüedad: 4 años, 7 meses
Puntos: 0
Respuesta: Maximo valor Mysql

Perdonar pero no entendisteis por que dan esos resultado por que los espacios no aparecieron bien en la tabla. Pongo de nuevo aquí la explicación, veréis como ahora lo entendéis:

Tabla: FechaControl

Columnas:
| Estado | codigoproyecto | vercodigoproyecto |-----fecha-----|

aceptado------ 18--------------------0----------- 06-05-2016
anulado-------- 18-------------------1------------10-09-2016
borrado---------18-------------------2-------------01-03-2017
aceptado--------19-------------------0------------09-04-2017

El dato que da la pagina es el año.

Lo que yo quiero que depende le año que se elija te de como resultado de todos los códigos de proyectos el ultimo correspondiente a ese año.
Por ejemplo, si elijo 2016 solo debería de darme como resultado el:
anulado-------18--------1---------10-09-2016

Y como segundo ejemplo si elijo 2017 me daría como resultado:
borrado---------18-------------------2-------------01-03-2017
aceptado--------19-------------------0------------09-04-2017


Es por el vercodigoproyecto que significa diferentes versiones. El código de proyecto 18 tiene 3 versiones y el 19 tiene una version. Quiero que me coja de cada codigoproyecto la versión mas nueva de ese ese año elegido

Espero aclarar las duda ahora de el problema.
Muchas gracias por las respuestas.
  #7 (permalink)  
Antiguo 24/03/2017, 12:23
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 12 años, 10 meses
Puntos: 447
Respuesta: Maximo valor Mysql

Hola miguel20dh:

Hay varias formas de obtener lo que necesitas, una de las que más hemos tratado en este mismo foro es utilizar subconsultas y JOIN's...

En primer lugar, lo que te interesa filtrar es la fecha máxima para cada proyecto para un año en específico, esto lo haces con una consulta simple utilizando MAX y GROUP BY, es decir, hacer algo como esto:

Código MySQL:
Ver original
  1. mysql> SET @anio = 2016;
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SELECT codigoproyecto, MAX(fecha)
  5.     -> FROM tabla
  6.     -> WHERE YEAR(fecha) = @anio
  7.     -> GROUP BY codigoproyecto;
  8. +----------------+------------+
  9. | codigoproyecto | MAX(fecha) |
  10. +----------------+------------+
  11. |             18 | 2016-09-10 |
  12. +----------------+------------+
  13. 1 row in set (0.00 sec)
  14.  
  15. mysql> SET @anio = 2017;
  16. Query OK, 0 rows affected (0.00 sec)
  17.  
  18. mysql> SELECT codigoproyecto, MAX(fecha)
  19.     -> FROM tabla
  20.     -> WHERE YEAR(fecha) = @anio
  21.     -> GROUP BY codigoproyecto;
  22. +----------------+------------+
  23. | codigoproyecto | MAX(fecha) |
  24. +----------------+------------+
  25. |             18 | 2017-03-01 |
  26. |             19 | 2017-04-09 |
  27. +----------------+------------+
  28. 2 rows in set (0.00 sec)

Observa que la consulta es la misma, lo único que cambia es el valor del parámetro @anio. Ahora, lo que haces es utilizar esto como una subconsulta para filtrar sólo los registros que necesitas, esto lo haces con un INNER JOIN


Código MySQL:
Ver original
  1. mysql> SET @anio = 2016;
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SELECT T1.* FROM tabla T1
  5.     -> INNER JOIN
  6.     -> ( SELECT codigoproyecto, MAX(fecha) maxfecha
  7.     ->   FROM tabla
  8.     ->   WHERE YEAR(fecha) = @anio
  9.     ->   GROUP BY codigoproyecto) T2 ON T1.codigoproyecto = T2.codigoproyecto
  10.     ->                                  AND T1.fecha = T2.maxfecha;
  11. +---------+----------------+-------------------+------------+
  12. | Estado  | codigoproyecto | vercodigoproyecto | fecha      |
  13. +---------+----------------+-------------------+------------+
  14. | anulado |             18 |                 1 | 2016-09-10 |
  15. +---------+----------------+-------------------+------------+
  16. 1 row in set (0.00 sec)

y funciona también para el año 2017, mostrando dos registros:

Código MySQL:
Ver original
  1. mysql> SET @anio = 2017;
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SELECT T1.* FROM tabla T1
  5.     -> INNER JOIN
  6.     -> ( SELECT codigoproyecto, MAX(fecha) maxfecha
  7.     ->   FROM tabla
  8.     ->   WHERE YEAR(fecha) = @anio
  9.     ->   GROUP BY codigoproyecto) T2 ON T1.codigoproyecto = T2.codigoproyecto
  10.     ->                                  AND T1.fecha = T2.maxfecha;
  11. +----------+----------------+-------------------+------------+
  12. | Estado   | codigoproyecto | vercodigoproyecto | fecha      |
  13. +----------+----------------+-------------------+------------+
  14. | borrado  |             18 |                 2 | 2017-03-01 |
  15. | aceptado |             19 |                 0 | 2017-04-09 |
  16. +----------+----------------+-------------------+------------+
  17. 2 rows in set (0.00 sec)

Esta consulta sirve SÍ Y SÓLO SI, para cada proyecto hay una única fecha MÁXIMA, es decir, si tienes fechas repetidas el resultado puede no ser el esperado.

Haz la prueba y nos comentas.

Saludos
Leo.
  #8 (permalink)  
Antiguo 24/03/2017, 15:19
 
Fecha de Ingreso: marzo-2015
Mensajes: 15
Antigüedad: 4 años, 7 meses
Puntos: 0
Respuesta: Maximo valor Mysql

Muchas gracias, hago las las pruebas y comento. Pero en realidad no me tiene que coger la fecha máxima, me tiene que coger la máxima versión (vercodigoproyecto) para ese año elegido de cada proyecto. Así que de ese modo nunca van a coincidir versiones para un mismo proyecto porque van en aumento cuando se van añadiendo nuevos.
Se que es un poco confuso, si alguien quiero un acceso remoto para que le quede claro que me avise por privado, porque yo me explico fatal hahahaha.

Etiquetas: maximo, select, tabla, valor
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 16:36.