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

Agrupar x meses

Estas en el tema de Agrupar x meses en el foro de Mysql en Foros del Web. Hola Amigos !!! me falta casi nada para terminar una consulta y no me sale lo que necesito hacer es agrupar por mes una consulta ...
  #1 (permalink)  
Antiguo 22/08/2012, 12:09
 
Fecha de Ingreso: octubre-2010
Ubicación: Buenos Aires
Mensajes: 557
Antigüedad: 14 años
Puntos: 4
Agrupar x meses

Hola Amigos !!!
me falta casi nada para terminar una consulta y no me sale
lo que necesito hacer es agrupar por mes una consulta , hasta ahi todo bien
pero lo que no se hacer es que tambien me agrupe, por ejemplo cuantas compras se hicieron ese mes
la consulta es asi:

Código SQL:
Ver original
  1. SELECT CASE WHEN MONTH(compra_fecha) = 1 THEN "ene"
  2.                             WHEN MONTH(compra_fecha) = 2 THEN "feb"
  3.                             WHEN MONTH(compra_fecha) = 3 THEN "mar"
  4.                             WHEN MONTH(compra_fecha) = 4 THEN "abr"
  5.                             WHEN MONTH(compra_fecha) = 5 THEN "may"
  6.                             WHEN MONTH(compra_fecha) = 6 THEN "jun"
  7.                             WHEN MONTH(compra_fecha) = 7 THEN "jul"
  8.                             WHEN MONTH(compra_fecha) = 8 THEN "ago"
  9.                             WHEN MONTH(compra_fecha) = 9 THEN "sep"
  10.                             WHEN MONTH(compra_fecha) = 10 THEN "oct"
  11.                             WHEN MONTH(compra_fecha) = 11 THEN "nov"
  12.                             WHEN MONTH(compra_fecha) = 12 THEN "dic"
  13.                              END AS mes,compra_id FROM compras GROUP BY mes,compra_id
necesitaba saber cuantas 'compra_id' pertenecen a cada mes
como se ve , agrupe por mes y por compra_id, pero no tengo el resultado deseado
Saludos y gracias por cualquier ayuda que me puedan brindar!!!
  #2 (permalink)  
Antiguo 22/08/2012, 13:44
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 9 meses
Puntos: 447
Respuesta: Agrupar x meses

Hola tumbero_x:

No me queda claro cómo es que necesitas presentar la información... creo que sería conveniente en primer lugar que nos digas cuál es la estructura de tu tabla, que nos pongas algunos datos de ejemplo y que nos digas exactamente qué es lo que pretendes obtener como salida... a partir de lo que trataste de explicar se me ocurren dos posible soluciones. Checa este script:


Código MySQL:
Ver original
  1. mysql> SELECT * FROM compras;
  2. +-----------+--------------+----------+
  3. | compra_id | compra_fecha | cantidad |
  4. +-----------+--------------+----------+
  5. |         1 | 2012-08-22   |       10 |
  6. |         1 | 2012-09-22   |       12 |
  7. |         1 | 2012-09-22   |       15 |
  8. |         2 | 2012-10-22   |       13 |
  9. |         2 | 2012-07-22   |       11 |
  10. |         2 | 2012-08-22   |        8 |
  11. |         3 | 2012-08-22   |       16 |
  12. |         3 | 2012-07-22   |        6 |
  13. |         3 | 2012-07-22   |        7 |
  14. |         3 | 2012-07-22   |        9 |
  15. +-----------+--------------+----------+
  16. 10 rows in set (0.00 sec)
  17.  
  18. mysql> SELECT
  19.     ->   CASE
  20.     ->   WHEN MONTH(compra_fecha) = 7 THEN "jul"
  21.     ->   WHEN MONTH(compra_fecha) = 8 THEN "ago"
  22.     ->   WHEN MONTH(compra_fecha) = 9 THEN "sep"
  23.     ->   WHEN MONTH(compra_fecha) = 10 THEN "oct"
  24.     ->   END mes,
  25.     ->   COUNT(*)
  26.     -> FROM compras
  27.     -> GROUP BY mes;
  28. +------+----------+
  29. | mes  | COUNT(*) |
  30. +------+----------+
  31. | ago  |        3 |
  32. | jul  |        4 |
  33. | oct  |        1 |
  34. | sep  |        2 |
  35. +------+----------+
  36. 4 rows in set (0.00 sec)
  37.  
  38. mysql> SELECT
  39.     ->   compra_id,
  40.     ->   SUM(IF(MONTH(compra_fecha) = 7, 1, 0)) 'jul',
  41.     ->   SUM(IF(MONTH(compra_fecha) = 8, 1, 0)) 'ago',
  42.     ->   SUM(IF(MONTH(compra_fecha) = 9, 1, 0)) 'sep',
  43.     ->   SUM(IF(MONTH(compra_fecha) = 10, 1, 0)) 'oct'
  44.     -> FROM compras
  45.     -> GROUP BY compra_id;
  46. +-----------+------+------+------+------+
  47. | compra_id | jul  | ago  | sep  | oct  |
  48. +-----------+------+------+------+------+
  49. |         1 |    0 |    1 |    2 |    0 |
  50. |         2 |    1 |    1 |    0 |    1 |
  51. |         3 |    3 |    1 |    0 |    0 |
  52. +-----------+------+------+------+------+
  53. 3 rows in set (0.00 sec)

En el primero de los casos, te muestra el total de compras por mes, en forma de renglones, pero sin considerar los compras_id's... en el segundo caso presenta el total de compras por mes, pero en forma de columnas, y aquí sí considerando el id de la compra... checa ambas consultas y di si alguna de estas es lo que pretendes, sino trata de de explicar mejor tu problema y con gusto tratamos de ayudarte.

Saludos
Leo.
  #3 (permalink)  
Antiguo 22/08/2012, 13:54
 
Fecha de Ingreso: octubre-2010
Ubicación: Buenos Aires
Mensajes: 557
Antigüedad: 14 años
Puntos: 4
Respuesta: Agrupar x meses

Hola Leo Muchas gracias por responder
recien solucione el problema juntando todas las Compras_id de un determinado mes
Código MySQL:
Ver original
  1. SELECT CASE WHEN MONTH(compra_fecha) = 1 THEN "Ene"
  2.                             WHEN MONTH(compra_fecha) = 2 THEN "Feb"
  3.                             WHEN MONTH(compra_fecha) = 3 THEN "Mar"
  4.                             WHEN MONTH(compra_fecha) = 4 THEN "Abr"
  5.                             WHEN MONTH(compra_fecha) = 5 THEN "May"
  6.                             WHEN MONTH(compra_fecha) = 6 THEN "Jun"
  7.                             WHEN MONTH(compra_fecha) = 7 THEN "Jul"
  8.                             WHEN MONTH(compra_fecha) = 8 THEN "Ago"
  9.                             WHEN MONTH(compra_fecha) = 9 THEN "Sep"
  10.                             WHEN MONTH(compra_fecha) = 10 THEN "Oct"
  11.                             WHEN MONTH(compra_fecha) = 11 THEN "Nov"
  12.                             WHEN MONTH(compra_fecha) = 12 THEN "Dic"
  13.                              END AS mes,COUNT(compra_id) AS id,compra_cod_prov AS prove FROM compras GROUP BY mes ORDER BY MONTH(compra_fecha) ASC
mi problema ahora es que en esa misma consulta tengo que agrupar compra_cod_prov que es un campo INT , por ejemplo , ya se cuantas compras hice en un determinado mes , ahora necesito saber a cuantos proveedores le compre en ese determinado mes (disculpame la explicacion de novato jaja)por medio de compra_cod_prov
el destino final de todo esto es hacer unas estadsticas mostradas en javascript
Saludos y gracias nuevamente!!!
  #4 (permalink)  
Antiguo 23/08/2012, 07:31
 
Fecha de Ingreso: octubre-2010
Ubicación: Buenos Aires
Mensajes: 557
Antigüedad: 14 años
Puntos: 4
Respuesta: Agrupar x meses

Hola Amigos , Sigo sin poder resolverlo si alguien me da una idea se lo voy a agradecer un monton
Saludos!!!
  #5 (permalink)  
Antiguo 23/08/2012, 09:25
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 9 meses
Puntos: 447
Respuesta: Agrupar x meses

Hola de nuevo tumbero_x:

En mi post pasado escribía esto:

Cita:
No me queda claro cómo es que necesitas presentar la información... creo que sería conveniente en primer lugar que nos digas cuál es la estructura de tu tabla, que nos pongas algunos datos de ejemplo y que nos digas exactamente qué es lo que pretendes obtener como salida..
Pero veo que no seguiste mi consejo... hablas de un campo compra_cod_prov, pero no nos dices ni de qué tipo es, ni que información almacena ni nada por el estilo... los datos brillan por su ausencia y tampoco te molestaste en mostrarnos cuál es el resultado de la ejecución de la consulta que pusiste... así es muy difícil tratar de ayudarte. En realidad resultaría más útil que hubieras puesto esta información que la consulta que hiciste... de esta manera podríamos plantear una solución diferente a la que estás tratando de hacer.

Finalmente, y a modo de aprendizaje, la sentencia CASE-WHEN tiene dos formas de utilizarse... en tu caso en realidad estás haciendo 12 comparaciones, una por cada mes, pero podrías hacer una sola comparación, checa este script:

Código MySQL:
Ver original
  1. mysql> SELECT fecha,
  2.     ->   CASE
  3.     ->   WHEN MONTH(fecha) = 1 THEN "ene"
  4.     ->   WHEN MONTH(fecha) = 2 THEN "feb"
  5.     ->   WHEN MONTH(fecha) = 3 THEN "mar"
  6.     ->   WHEN MONTH(fecha) = 4 THEN "abr"
  7.     ->   WHEN MONTH(fecha) = 5 THEN "may"
  8.     ->   WHEN MONTH(fecha) = 6 THEN "jun"
  9.     ->   WHEN MONTH(fecha) = 7 THEN "jul"
  10.     ->   WHEN MONTH(fecha) = 8 THEN "ago"
  11.     ->   WHEN MONTH(fecha) = 9 THEN "sep"
  12.     ->   WHEN MONTH(fecha) = 10 THEN "oct"
  13.     ->   WHEN MONTH(fecha) = 11 THEN "nov"
  14.     ->   WHEN MONTH(fecha) = 12 THEN "dic"
  15.     ->   END mes
  16.     -> FROM meses;
  17. +------------+------+
  18. | fecha      | mes  |
  19. +------------+------+
  20. | 2012-01-01 | ene  |
  21. | 2012-02-01 | feb  |
  22. | 2012-03-01 | mar  |
  23. | 2012-04-01 | abr  |
  24. | 2012-05-01 | may  |
  25. | 2012-06-01 | jun  |
  26. | 2012-07-01 | jul  |
  27. | 2012-08-01 | ago  |
  28. | 2012-09-01 | sep  |
  29. | 2012-10-01 | oct  |
  30. | 2012-11-01 | nov  |
  31. | 2012-12-01 | dic  |
  32. +------------+------+
  33. 12 rows in set (0.00 sec)
  34.  
  35. mysql> SELECT fecha,
  36.     ->   CASE MONTH(fecha)
  37.     ->   WHEN 1 THEN "ene"
  38.     ->   WHEN 2 THEN "feb"
  39.     ->   WHEN 3 THEN "mar"
  40.     ->   WHEN 4 THEN "abr"
  41.     ->   WHEN 5 THEN "may"
  42.     ->   WHEN 6 THEN "jun"
  43.     ->   WHEN 7 THEN "jul"
  44.     ->   WHEN 8 THEN "ago"
  45.     ->   WHEN 9 THEN "sep"
  46.     ->   WHEN 10 THEN "oct"
  47.     ->   WHEN 11 THEN "nov"
  48.     ->   WHEN 12 THEN "dic"
  49.     ->   END mes
  50.     -> FROM meses;
  51. +------------+------+
  52. | fecha      | mes  |
  53. +------------+------+
  54. | 2012-01-01 | ene  |
  55. | 2012-02-01 | feb  |
  56. | 2012-03-01 | mar  |
  57. | 2012-04-01 | abr  |
  58. | 2012-05-01 | may  |
  59. | 2012-06-01 | jun  |
  60. | 2012-07-01 | jul  |
  61. | 2012-08-01 | ago  |
  62. | 2012-09-01 | sep  |
  63. | 2012-10-01 | oct  |
  64. | 2012-11-01 | nov  |
  65. | 2012-12-01 | dic  |
  66. +------------+------+
  67. 12 rows in set (0.00 sec)

La primer consulta es tal y como la estás manejando, que en términos de programación se comporta como un IF anidado. En la segunda consulta sólo se compara una vez, y en términos de programación se comporta como un SWITCH.

Saludos
Leo.
  #6 (permalink)  
Antiguo 23/08/2012, 09:47
 
Fecha de Ingreso: octubre-2010
Ubicación: Buenos Aires
Mensajes: 557
Antigüedad: 14 años
Puntos: 4
Respuesta: Agrupar x meses

Hola leonardo_josue gracias por responder
mas arriba aclare que compra_cod_prov se trataba de un campo INT
igualmente pido disculpas por no ser tan claro en la explicacion de mi problema
ya cambie la consulta comparando el campo una sola vez y quedo perfecto
ahora, me puse a investigar y encontre la funcion COUNT(DISTINCT expr,[expr...])
con esta funcion pude agrupar compra_cod_prov
me quedo asi
Código MySQL:
Ver original
  1. SELECT compra_fecha,
  2.                         CASE MONTH(compra_fecha)
  3.                         WHEN 1 THEN "Ene"
  4.                         WHEN 2 THEN "Feb"
  5.                         WHEN 3 THEN "Mar"
  6.                         WHEN 4 THEN "Abr"
  7.                         WHEN 5 THEN "May"
  8.                         WHEN 6 THEN "Jun"
  9.                         WHEN 7 THEN "Jul"
  10.                         WHEN 8 THEN "Ago"
  11.                         WHEN 9 THEN "Sep"
  12.                         WHEN 10 THEN "Oct"
  13.                         WHEN 11 THEN "Nov"
  14.                         WHEN 12 THEN "Dic"
  15.                      END AS mes,COUNT(compra_id) AS id, COUNT(DISTINCT compra_cod_prov) AS prove
  16. FROM compras GROUP BY mes ORDER BY MONTH(compra_fecha) ASC
Saludos!!! muchas gracias

Última edición por tumbero_x; 23/08/2012 a las 09:53

Etiquetas: agrupar, meses, 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 00:57.