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

[SOLUCIONADO] Sumar y agrupar por mes (Consulta)

Estas en el tema de Sumar y agrupar por mes (Consulta) en el foro de Mysql en Foros del Web. Buenas a todos. Tengo la siguiente consulta @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original SELECT   `re` . `retencion` AS `name` ,   CONCAT_WS ( ', ...
  #1 (permalink)  
Antiguo 10/04/2016, 16:22
Avatar de kurt_fj  
Fecha de Ingreso: septiembre-2006
Mensajes: 10
Antigüedad: 17 años, 7 meses
Puntos: 0
Pregunta Sumar y agrupar por mes (Consulta)

Buenas a todos. Tengo la siguiente consulta

Código MySQL:
Ver original
  1.   `re`.`retencion` AS `name`,
  2.   CONCAT_WS(', ',
  3.     IF(MONTH(a.fecha) = 1, SUM(ahr.cantidad), 0),
  4.     IF(MONTH(a.fecha) = 2, SUM(ahr.cantidad), 0),
  5.     IF(MONTH(a.fecha) = 3, SUM(ahr.cantidad), 0),
  6.     IF(MONTH(a.fecha) = 4, SUM(ahr.cantidad), 0),
  7.     IF(MONTH(a.fecha) = 5, SUM(ahr.cantidad), 0),
  8.     IF(MONTH(a.fecha) = 6, SUM(ahr.cantidad), 0),
  9.     IF(MONTH(a.fecha) = 7, SUM(ahr.cantidad), 0),
  10.     IF(MONTH(a.fecha) = 8, SUM(ahr.cantidad), 0),
  11.     IF(MONTH(a.fecha) = 9, SUM(ahr.cantidad), 0),
  12.     IF(MONTH(a.fecha) = 10, SUM(ahr.cantidad), 0),
  13.     IF(MONTH(a.fecha) = 11, SUM(ahr.cantidad), 0),
  14.     IF(MONTH(a.fecha) = 12, SUM(ahr.cantidad), 0)
  15.   ) AS `data`
  16.   `actas` `a`
  17. INNER JOIN `actas_has_retenciones` `ahr` ON `fk_actas_id` = `acta_id`
  18. INNER JOIN `retenciones` `re` ON `retenciones_id` = `fk_retenciones_id`
  19. WHERE YEAR(`a`.`fecha`) = YEAR(now())
  20. GROUP BY `re`.`retencion`, MONTH(`a`.`fecha`)
  21. ORDER BY `name` ASC;
que me da como resultado:

Código MySQL:
Ver original
  1. +------------------+-------------------------------------+
  2. | name             | data                                |
  3. +------------------+-------------------------------------+
  4. | Arma de Fuego    | 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0  |
  5. | Arma de Fuego    | 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0  |
  6. | cerveza          | 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0 |
  7. | Equipos          | 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
  8. | Moto             | 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
  9. | Persona          | 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0  |
  10. | Productos Varios | 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
  11. | Repuesto         | 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
  12. +------------------+-------------------------------------+
  13. 8 rows in set (0.00 sec)
Como se ve, "Arma de Fuego" se repite pues aparece en dos meses (Marzo y Abril).

Mi intención es obtener los resultados de esta forma:

Código MySQL:
Ver original
  1. +------------------+-------------------------------------+
  2. | name             | data                                |
  3. +------------------+-------------------------------------+
  4. | Arma de Fuego    | 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0  |
  5. | cerveza          | 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0 |
  6. | Equipos          | 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
  7. | Moto             | 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
  8. | Persona          | 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0  |
  9. | Productos Varios | 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
  10. | Repuesto         | 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
  11. +------------------+-------------------------------------+
  12. 7 rows in set (0.00 sec)
Ahora, "Arma de Fuego" no se repite y se ha colocado la suma de cada mes en su posición.

¿Cómo podría obtener los resultados de esta forma?

Gracias por la ayuda que me puedan prestar.
  #2 (permalink)  
Antiguo 10/04/2016, 16:39
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, 5 meses
Puntos: 2658
Respuesta: Sumar y agrupar por mes (Consulta)

Es que estás agrupando por meses también, y el resultado que quieres, de acuerdo a lo que dices es SIN agrupamiento por mes.

Código SQL:
Ver original
  1. SELECT
  2.   `re`.`retencion` `name`,
  3.   CONCAT_WS(', ',
  4.     IF(MONTH(a.fecha) = 1, SUM(ahr.cantidad), 0),
  5.     IF(MONTH(a.fecha) = 2, SUM(ahr.cantidad), 0),
  6.     IF(MONTH(a.fecha) = 3, SUM(ahr.cantidad), 0),
  7.     IF(MONTH(a.fecha) = 4, SUM(ahr.cantidad), 0),
  8.     IF(MONTH(a.fecha) = 5, SUM(ahr.cantidad), 0),
  9.     IF(MONTH(a.fecha) = 6, SUM(ahr.cantidad), 0),
  10.     IF(MONTH(a.fecha) = 7, SUM(ahr.cantidad), 0),
  11.     IF(MONTH(a.fecha) = 8, SUM(ahr.cantidad), 0),
  12.     IF(MONTH(a.fecha) = 9, SUM(ahr.cantidad), 0),
  13.     IF(MONTH(a.fecha) = 10, SUM(ahr.cantidad), 0),
  14.     IF(MONTH(a.fecha) = 11, SUM(ahr.cantidad), 0),
  15.     IF(MONTH(a.fecha) = 12, SUM(ahr.cantidad), 0)
  16.   ) `data`
  17. FROM
  18.   `actas` `a`
  19. INNER JOIN `actas_has_retenciones` `ahr` ON `fk_actas_id` = `acta_id`
  20. INNER JOIN `retenciones` `re` ON `retenciones_id` = `fk_retenciones_id`
  21. WHERE YEAR(`a`.`fecha`) = YEAR(CURDATE())
  22. GROUP BY `re`.`retencion`
  23. ORDER BY `name` ASC;
__________________
¿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 10/04/2016, 16:52
Avatar de kurt_fj  
Fecha de Ingreso: septiembre-2006
Mensajes: 10
Antigüedad: 17 años, 7 meses
Puntos: 0
Respuesta: Sumar y agrupar por mes (Consulta)

Hola gnzsoloyo, aprovecho para decir que te considero una especie de héroe en el foro de Base de Datos.

La consulta que me propones da como resultado:

Código MySQL:
Ver original
  1. +------------------+-------------------------------------+
  2. | name             | data                                |
  3. +------------------+-------------------------------------+
  4. | Arma de Fuego    | 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0  |
  5. | cerveza          | 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0 |
  6. | Equipos          | 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
  7. | Moto             | 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
  8. | Persona          | 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0  |
  9. | Productos Varios | 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
  10. | Repuesto         | 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
  11. +------------------+-------------------------------------+
  12. 7 rows in set (0.01 sec)

Lo cual no es lo que necesito, pues, si nos fijamos en "Arma de Fuego" nos suma 2 y 3, que serían Marzo y Abril respectivamente, quedando como resultado 5 en la posición del mes de Abril.

De nuevo, gracias por la ayuda.
  #4 (permalink)  
Antiguo 10/04/2016, 18:03
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, 5 meses
Puntos: 2658
Respuesta: Sumar y agrupar por mes (Consulta)

El error está en la operación que se realiza. El SUM() en ese caso no está discriminando por el mes. Solo hace la suma sobre el total de registros cuando el mes es el buscado, pero lo hace sobre la tabla entera.
COmo el unico caso donde tienes datos de dos meses diferentes es ese producto, no notas que está haciendo lo mismo en todos los demás. Pero lo hace.

La solución debería pasar por cambiar el orden de las funciones:

Código MySQL:
Ver original
  1.     `re`.`retencion` `name`,
  2.     CONCAT_WS(', ',
  3.             SUM(IF(MONTH(a.fecha) = 1, ahr.cantidad, 0)),
  4.             SUM(IF(MONTH(a.fecha) = 2, ahr.cantidad, 0)),
  5.             SUM(IF(MONTH(a.fecha) = 3, ahr.cantidad, 0)),
  6.             SUM(IF(MONTH(a.fecha) = 4, ahr.cantidad, 0)),
  7.             SUM(IF(MONTH(a.fecha) = 5, ahr.cantidad, 0)),
  8.             SUM(IF(MONTH(a.fecha) = 6, ahr.cantidad, 0)),
  9.             SUM(IF(MONTH(a.fecha) = 7, ahr.cantidad, 0)),
  10.             SUM(IF(MONTH(a.fecha) = 8, ahr.cantidad, 0)),
  11.             SUM(IF(MONTH(a.fecha) = 9, ahr.cantidad, 0)),
  12.             SUM(IF(MONTH(a.fecha) = 10, ahr.cantidad, 0)),
  13.             SUM(IF(MONTH(a.fecha) = 11, ahr.cantidad, 0)),
  14.             SUM(IF(MONTH(a.fecha) = 12, ahr.cantidad, 0))) `data`
  15.     `actas` `a`
  16.         INNER JOIN
  17.     `actas_has_retenciones` `ahr` ON `fk_actas_id` = `acta_id`
  18.         INNER JOIN
  19.     `retenciones` `re` ON `retenciones_id` = `fk_retenciones_id`
  20.     YEAR(`a`.`fecha`) = YEAR(CURDATE())
  21. GROUP BY `re`.`retencion`
  22. ORDER BY `name` ASC;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 10/04/2016, 18:31
Avatar de kurt_fj  
Fecha de Ingreso: septiembre-2006
Mensajes: 10
Antigüedad: 17 años, 7 meses
Puntos: 0
Respuesta: Sumar y agrupar por mes (Consulta)

He usado tu consulta y el resultado es:

Código MySQL:
Ver original
  1. +------------------+-------------------------------------+
  2. | name             | data                                |
  3. +------------------+-------------------------------------+
  4. | Arma de Fuego    | 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0  |
  5. | cerveza          | 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0 |
  6. | Equipos          | 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
  7. | Moto             | 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
  8. | Persona          | 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0  |
  9. | Productos Varios | 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
  10. | Repuesto         | 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
  11. +------------------+-------------------------------------+
  12. 7 rows in set (0.00 sec)

Ese es justo el resultado que esperaba. Ahora puedo mostrar esos resultados en gráficas. Infinitas gracias por tu ayuda .
  #6 (permalink)  
Antiguo 11/04/2016, 05:38
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, 5 meses
Puntos: 2658
Respuesta: Sumar y agrupar por mes (Consulta)



__________________
¿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: agrupar, bases-de-datos-general, fecha, select
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 20:05.