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

Datos ultimos meses... 0 si no hay datos

Estas en el tema de Datos ultimos meses... 0 si no hay datos en el foro de Mysql en Foros del Web. Hola, Estoy intentando obtener los pedidos de los últimos 12 meses agrupados por mes. Consigo que me muestros los datos existentes pero no los meses ...
  #1 (permalink)  
Antiguo 02/01/2018, 03:50
 
Fecha de Ingreso: abril-2003
Ubicación: Valencia
Mensajes: 223
Antigüedad: 20 años, 11 meses
Puntos: 7
Datos ultimos meses... 0 si no hay datos

Hola,
Estoy intentando obtener los pedidos de los últimos 12 meses agrupados por mes.

Consigo que me muestros los datos existentes pero no los meses en los que no hay datos...

Esta es mi consulta:
Código:
SELECT DATE_FORMAT(pedidofecha, '%Y') AS y, DATE_FORMAT(pedidofecha, '%m') AS m, COUNT(*) AS pedidos FROM pedido WHERE pedidofecha BETWEEN (CURDATE() - INTERVAL 12 MONTH) AND CURDATE() GROUP BY DATE_FORMAT(pedidofecha, '%m-%Y') ORDER BY y DESC, m DESC ";
Lo que necesito es que:
  • me muestre todos los meses
  • ponga 0 si no hay resultado

y m pedido
2018 1 0
2017 12 5
2017 11 9
2017 10 0
2017 09 11
...

gracias por la ayuda
  #2 (permalink)  
Antiguo 02/01/2018, 04:22
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Datos ultimos meses... 0 si no hay datos

Si no hay datos nunca podrá mostrar esos meses.
La solución más simple es crear una tabla de meses contra la que hacer LEFT JOIN, tal que cubra lo faltante.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 02/01/2018, 09:29
 
Fecha de Ingreso: abril-2003
Ubicación: Valencia
Mensajes: 223
Antigüedad: 20 años, 11 meses
Puntos: 7
Respuesta: Datos ultimos meses... 0 si no hay datos

Entonces si en septiembre y noviembre tengo pedidos y en octubre no, ¿no hay forma de mostrar 0 pedidos en octubre?

2017 10 0 pedidos

No consigo hacerlo pero que algo se puede hacer...

Gracias de todas formas
Saludos
  #4 (permalink)  
Antiguo 02/01/2018, 10:05
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 7 meses
Puntos: 774
Respuesta: Datos ultimos meses... 0 si no hay datos

como te dijeron crea una tabla con los meses y tu resultado haces un left join con esa tabla de meses, donde sea Null el mes entonces ahi pones el 0
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 04/01/2018, 05:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Datos ultimos meses... 0 si no hay datos

Vamos a ver si se entiende la idea...

Creo una tabla basica de ventas:

Código SQL:
Ver original
  1. mysql> CREATE TABLE ventas(id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, fecha datetime, importe DECIMAL(14,3));
  2. Query OK, 0 ROWS affected (0.23 sec)

Inserto algunas pocas ventas:
Código SQL:
Ver original
  1. mysql> INSERT INTO ventas(fecha, importe)
  2.     -> VALUES('2017-01-11 17:45:00', 1234.21),
  3.     -> ('2017-03-11 13:45:00', 1234.21),
  4.     -> ('2017-11-11 17:45:00', 1234.21);
  5. Query OK, 3 ROWS affected (0.10 sec)
  6. Records: 3  Duplicates: 0  Warnings: 0
Creo una tabla de meses:
Código SQL:
Ver original
  1. mysql> CREATE TABLE meses(nro_mes SMALLINT PRIMARY KEY, nombre_mes VARCHAR(100));
  2. Query OK, 0 ROWS affected (0.24 sec)
La lleno con los meses:
Código SQL:
Ver original
  1. mysql> INSERT INTO meses
  2.     -> VALUES (1, 'Enero'),
  3.     -> (2, 'Febrero'),
  4.     -> (3, 'Marzo'),
  5.     -> (4, 'Abril'),
  6.     -> (5, 'Mayo'),
  7.     -> (6, 'Junio'),
  8.     -> (7, 'Julio'),
  9.     -> (8, 'Agosto'),
  10.     -> (9, 'Septiembre'),
  11.     -> (10, 'Octubre'),
  12.     -> (11, 'Noviembre'),
  13.     -> (12, 'Diciembre');
  14. Query OK, 12 ROWS affected (0.05 sec)
  15. Records: 12  Duplicates: 0  Warnings: 0

Hago una consulta usando la funcion IFNULL para poner ceros donde no hay datos:
Código SQL:
Ver original
  1. mysql> SELECT 2017 Anio, nro_mes Mes, IFNULL(importe, 0.0) importe
  2.     -> FROM meses M LEFT JOIN ventas V ON M.nro_mes = MONTH(fecha);
  3. +------+-----+----------+
  4. | Anio | Mes | importe  |
  5. +------+-----+----------+
  6. | 2017 |   1 | 1234.210 |
  7. | 2017 |   2 |    0.000 |
  8. | 2017 |   3 | 1234.210 |
  9. | 2017 |   4 |    0.000 |
  10. | 2017 |   5 |    0.000 |
  11. | 2017 |   6 |    0.000 |
  12. | 2017 |   7 |    0.000 |
  13. | 2017 |   8 |    0.000 |
  14. | 2017 |   9 |    0.000 |
  15. | 2017 |  10 |    0.000 |
  16. | 2017 |  11 | 1234.210 |
  17. | 2017 |  12 |    0.000 |
  18. +------+-----+----------+
  19. 12 ROWS IN SET (0.00 sec)

Esa es la idea básica, que puedes combinar como desees.

¿Queda mas claro así?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: meses, select, todo
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 14:33.