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

Consulta MySQL Group by

Estas en el tema de Consulta MySQL Group by en el foro de Mysql en Foros del Web. Hola gente. Tengo el siguiente problema: tengo una tabla asi: Tipo Incidencia Fecha Mouse | 05/01/12 Teclado | 03/01/12 Teclado | 23/01/12 Booteo | 01/11/12 ...
  #1 (permalink)  
Antiguo 05/01/2012, 14:06
 
Fecha de Ingreso: mayo-2005
Ubicación: Tucumán
Mensajes: 11
Antigüedad: 18 años, 10 meses
Puntos: 0
Consulta MySQL Group by

Hola gente. Tengo el siguiente problema: tengo una tabla asi:

Tipo Incidencia Fecha
Mouse | 05/01/12
Teclado | 03/01/12
Teclado | 23/01/12
Booteo | 01/11/12
Mouse | 20/12/11

(los datos son a modo de ejemplo). lo que necesito es armar una tabla dinamica que tenga los siguientes calculos:

Tipo Incidencia Ene Feb Mar Abr May Jun Jul Ago Sep Oct Nov Dic
Mouse | 1 1
Booteo | 1
Teclado | 2

(se que sale desordenado aqui no encontre la forma de meterlo en una tabla)
Es decir que me cuente la cantidad de cada tipo de incidencia por mes.

Tengo lo siguiente:
Código:
SELECT DATE_FORMAT( fecha,  '%M' ) as mes , COUNT( tipoinc ) , aux_tipoinc.detalleinc
FROM principal
JOIN aux_tipoinc ON aux_tipoinc.idtipoinc = principal.tipoinc
GROUP BY mes,tipoinc
Pero el problema es que me devuelve el mes repetido varias veces. No se si hay una forma de obtener una columna con cada mes.

Luego esto lo tengo que volcar a un PHP donde se tiene que armar dinamicamente, por eso mientras mas "cocinado" salga de la DB mejor. Pense también en usar un array en PHP de alguna manera pero no se me ocurre como puedo organizarlo.

Los nombres de los meses deben salir de acuerdo a los datos que hayan, no necesito q salgan todos los meses como columnas.

Espero puedan ayudarme.

Muchas gracias desde ya.

Saludos

Nacho
  #2 (permalink)  
Antiguo 05/01/2012, 15:45
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consulta MySQL Group by

Hola iavellaneda:

Hay varias formas en las que puedes resolver este problema. Una de las maneras más comunes es más o menos así:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE tabla (Incidencia VARCHAR(10), Fecha DATE);
  2. Query OK, 0 rows affected (0.19 sec)
  3.  
  4. mysql> INSERT INTO tabla VALUES
  5.     -> ('Mouse', '2012-01-03'),
  6.     -> ('Teclado', '2012-01-03'),
  7.     -> ('Teclado', '2012-02-04'),
  8.     -> ('Booteo', '2012-03-01'),
  9.     -> ('Mouse', '2011-01-12'),
  10.     -> ('Booteo', '2011-02-12');
  11. Query OK, 6 rows affected (0.06 sec)
  12. Records: 6  Duplicates: 0  Warnings: 0
  13.  
  14. mysql> SELECT * FROM tabla;
  15. +------------+------------+
  16. | Incidencia | Fecha      |
  17. +------------+------------+
  18. | Mouse      | 2012-01-03 |
  19. | Teclado    | 2012-01-03 |
  20. | Teclado    | 2012-02-04 |
  21. | Booteo     | 2012-03-01 |
  22. | Mouse      | 2011-01-12 |
  23. | Booteo     | 2011-02-12 |
  24. +------------+------------+
  25. 6 rows in set (0.00 sec)
  26.  
  27. mysql> SELECT
  28.     -> incidencia,
  29.     -> SUM(IF(MONTH(fecha) = 1, 1, 0)) enero,
  30.     -> SUM(IF(MONTH(fecha) = 2, 1, 0)) febrero,
  31.     -> SUM(IF(MONTH(fecha) = 3, 1, 0)) marzo
  32.     -> FROM tabla
  33.     -> GROUP BY incidencia;
  34. +------------+-------+---------+-------+
  35. | incidencia | enero | febrero | marzo |
  36. +------------+-------+---------+-------+
  37. | Booteo     |     0 |       1 |     1 |
  38. | Mouse      |     2 |       0 |     0 |
  39. | Teclado    |     1 |       1 |     0 |
  40. +------------+-------+---------+-------+
  41. 3 rows in set (0.00 sec)

Aquí tendrías que completar todos los SUM, uno para cada mes. De esta manera, los meses que no tengan información simplemente aparecen con cero. Sólo hay que tener cuidado de evaluar un año a la vez, ya que si no lo haces entonces sumaria los registros independientemente del año.

Dale un vistazo al código para ver si te sirve.

Saludos
Leo.
  #3 (permalink)  
Antiguo 06/01/2012, 09:14
 
Fecha de Ingreso: mayo-2005
Ubicación: Tucumán
Mensajes: 11
Antigüedad: 18 años, 10 meses
Puntos: 0
Respuesta: Consulta MySQL Group by

Muchisimas gracias. Es justo lo que necesitaba y funciona perfecto. Te hago una consulta nada mas por curiosidad:

SELECT tipoinc,
SUM(IF(MONTH(fecha) = 1, 1, 0)) ene,
SUM(IF(MONTH(fecha) = 2, 1, 0)) feb,
SUM(IF(MONTH(fecha) = 3, 1, 0)) mar,
SUM(IF(MONTH(fecha) = 4, 1, 0)) abr,
[...]
FROM principal GROUP BY tipoinc;

me quedo algo asi al final. Crees que se pueda hacer un bucle reemplazando el numero de mes por un contador y el nombre del mes usando monthname?
Por ejemplo en cada SUM IF poner:

SUM(IF(MONTH(fecha) = @i,1,0)) monthname("2012-"@i"-01) //jaja no se como se concatena en mysql.
algo asi crees q se puede hacer para hacerlo mas corto?? Es para joder nada mas, me viene de 10 la solución.

Saludos y gracias.
  #4 (permalink)  
Antiguo 06/01/2012, 09:58
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consulta MySQL Group by

Hola de nuevo iavellaneda:

No puedes hacer SELECT's dinámicos, como lo pretendes hacer, en todo caso podrías utilizar un ciclo para generar la sentencia SQL de manera dinámica, es decir trabajar con Sentencias Preparadas, pero creo que terminaría siendo más complicado.

Checa estas páginas:

http://www.artfulsoftware.com/infotree/queries.php#523
(la parte que dice Automate pivot table queries y Pivot table basics: rows to columns)

http://stackoverflow.com/questions/1...ata-to-columns

Ah... y para concatenar en MySQL, puedes hacerlo con la función CONCAT:

Código MySQL:
Ver original
  1. mysql> SELECT concat('Hola', ' ', 'Mundo');
  2. +------------------------------+
  3. | concat('Hola', ' ', 'Mundo') |
  4. +------------------------------+
  5. | Hola Mundo                   |
  6. +------------------------------+
  7. 1 row in set (0.00 sec)

Saludos.
Leo

Etiquetas: group, join, php, select, tabla
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 03:09.