Cuando estamos trabajando, siempre se nos piden muchas consultas, para obtener todos los datos posibles, para poder obtener el máximo de información. Y una de las consultas que se me ha repetido muchas veces es, encontrar el total de pedidos obteniendo la última fecha del pedido y en otros sitios la petición de datos era diferente, pero con el mismo fin, datos agrupados con la fecha más reciente.
Datos de ejemplo
En este ejemplo, vamos a tener dos simples tablas, la tabla clientes, con los datos de los clientes:
id_cliente | nombre | apellidos | |
---|---|---|---|
1 | Alberto | Martínez | oyagum@gmail.com |
2 | Juan | Lopez | jlopez@gmail.com |
3 | Maria | Sanchez | msanchez@gmail.com |
4 | Pedro | Almodovar | palmodovar@gmail.com |
5 | Alberto | Martínez | oyagum@gmail.com |
Y la tabla pedidos con los datos de los pedidos
id | fecha_creacion | fecha_update | precio_total | id_persona |
---|---|---|---|---|
1 | 2017-02-06 21:28:01 | 2017-02-05 21:28:10 | 50 | 1 |
2 | 2017-02-05 21:38:48 | 2017-02-05 21:38:48 | 46 | 4 |
3 | 2017-02-05 21:38:50 | 2017-02-05 21:38:50 | 115 | 1 |
4 | 2017-02-05 21:38:50 | 2017-02-05 21:38:50 | 80 | 3 |
5 | 2017-02-05 21:38:50 | 2017-02-05 21:38:50 | 135 | 3 |
6 | 2017-02-05 21:38:50 | 2017-02-05 21:38:50 | 50 | 5 |
7 | 2017-02-05 21:38:50 | 2017-02-05 21:38:50 | 146 | 2 |
8 | 2017-02-05 21:38:50 | 2017-02-05 21:38:50 | 79 | 1 |
9 | 2017-02-05 21:38:51 | 2017-02-05 21:38:51 | 56 | 4 |
10 | 2017-02-05 21:38:51 | 2017-02-05 21:38:51 | 114 | 3 |
11 | 2017-02-05 21:38:51 | 2017-02-05 21:38:51 | 91 | 5 |
12 | 2017-02-05 21:38:51 | 2017-02-05 21:38:51 | 128 | 3 |
13 | 2017-02-05 21:38:51 | 2017-02-05 21:38:51 | 148 | 3 |
14 | 2017-02-05 21:38:52 | 2017-02-05 21:38:52 | 84 | 4 |
15 | 2017-02-05 21:38:53 | 2017-02-05 21:38:53 | 129 | 2 |
16 | 2017-02-05 21:38:53 | 2017-02-05 21:38:53 | 126 | 1 |
17 | 2017-02-05 21:38:53 | 2017-02-05 21:38:53 | 90 | 4 |
18 | 2017-02-05 21:38:53 | 2017-02-05 21:38:53 | 109 | 4 |
19 | 2017-02-05 21:38:54 | 2017-02-05 21:38:54 | 127 | 4 |
20 | 2017-02-05 21:38:54 | 2017-02-05 21:38:54 | 78 | 3 |
21 | 2017-02-05 21:38:54 | 2017-02-05 21:38:54 | 100 | 1 |
22 | 2017-02-05 21:38:54 | 2017-02-05 21:38:54 | 62 | 3 |
23 | 2017-02-05 21:38:54 | 2017-02-05 21:38:54 | 43 | 3 |
24 | 2017-02-05 21:38:55 | 2017-02-05 21:38:55 | 126 | 1 |
25 | 2017-02-05 21:38:55 | 2017-02-05 21:38:55 | 103 | 2 |
Tengo más datos en la tabla de pedidos, pero es para que os hagáis una idea.
La consulta SQL
Y ahora pasaremos a obtener la consulta para conseguir el total de pedidos de los clientes y la fecha de la última vez que compraron
Así que aquí os pongo como sería la consulta SQL:
1 2 3 4 5 6 | SELECT a.total_comprado, a.ultima_fecha_compra, b.nombre, b.apellidos, b.email FROM ( SELECT count(p.precio_total) as total_comprado, MAX(fecha_creacion) as ultima_fecha_compra, p.id_persona FROM pedidos p GROUP By p.id_persona ) a INNER JOIN clientes b ON a.id_persona = b.id_persona GROUP By a.id_persona |
Resultado
Y este sería el resultado de la consulta.
total_comprado | ultima_fecha_compra | nombre | apellidos | |
---|---|---|---|---|
15 | 2017-02-06 21:28:01 | Alberto | Martínez | oyagum@gmail.com |
16 | 2017-02-05 21:39:10 | Juan | Lopez | jlopez@gmail.com |
19 | 2017-02-05 21:39:04 | Maria | Sanchez | msanchez@gmail.com |
20 | 2017-02-05 21:39:09 | Pedro | Almodovar | palmodovar@gmail.com |
15 | 2017-02-05 21:39:09 | Alberto | Martínez | oyagum@gmail.com |
allen
Saludos gracias, me sirvio el principio que utilizo en las consulta. tenia que sacar un reporte del total por genreos de los miembros que pertenen a una organizacion y la cual estuviera activa,ademas fuera parte de la junta directiva y la junta directiva fuera la vigente.
Oyagum
Buenas,
Me alegro mucho que te haya sido de utilidad, aquí intento dar soluciones a los problemas cotidianos 🙂
ALEXANDER MARURI TTITO
Tengo un problema muy parecido solo que trabajo con 4 tablas; PERSONAS, MOVIMIENTOS, CLUBES,TIPOMOV
Personas
1,Juan
2,Mario
TipoMov
1, Registro Inicial
2, Pase Libre
Clubes
1,Alianza
2,Velez
MOVIMIENTOS
idMovimiento,id_Persona,id_tipoMovi,id_Club,FechaMov
1,1,1,1,2019-01-01
2,1,2,1,2019-05-05
3,1,2,2,2019-12-30
4,2,1,2,2019-02-01
5,2,2,2,2020-02-26
RESULTADO, lo que busco es obtener un listado de las personas con la ultima fecha de movimiento, a que club pasaron y que tipo de movimiento fue.
MOVIMIENTOS
idMovimiento,NomPersona,TipoMov,NomClub,FechaMov
3,Juan,Pase Libre,Velez,2019-12-30
5,Mario,Pase Libre,Velez,2020-02-26
He intentado varias ideas que consegui en internet pero sin exito, aplique el MAX, pero solo me devuelve el valor de ese campo, pero necesito que me retorne el valor de toda la fila, ya que con los valores de la fila puedo llamar a las demas tablas y obtener los valores reales de las demas tablas, UNA AYUDA POR FAVOR… estoy casi desesperado porque nose como plasmar mi idea en el codigo MySql
jonathan
muchas gracias