Ver Mensaje Individual
  #1 (permalink)  
Antiguo 22/08/2015, 09:53
Avatar de kurt_fj
kurt_fj
 
Fecha de Ingreso: septiembre-2006
Mensajes: 10
Antigüedad: 17 años, 7 meses
Puntos: 0
Exclamación ¿Cómo armar consulta por mes e id?

Muy buenas a todos.

Necesito hacer una serie de estadísticas basadas en las actas cargadas en el sistema. Básicamente deben ser estadísticas agrupadas por mes y por id. Planeo usar Highcharts (Gráficos en Javascript) para representar los datos de la consulta.

Dejo una imagen del modelo de la Base de Datos: [URL="https://www.dropbox.com/s/1bdeiuurnwm0mnr/CAPD343%283%29.png?dl=0"]Ver[/URL]

Una de las consultas sería mostrar los 5 puestos que más han cargado actas en cada mes. Dejo la estructura de las tablas involucradas:

Código SQL:
Ver original
  1. MariaDB [mydb]> DESC companias;
  2. +--------------+---------------------+------+-----+---------+----------------+
  3. | FIELD        | TYPE                | NULL | KEY | DEFAULT | Extra          |
  4. +--------------+---------------------+------+-----+---------+----------------+
  5. | companias_id | tinyint(3) UNSIGNED | NO   | PRI | NULL    | AUTO_INCREMENT |
  6. | compania     | VARCHAR(45)         | NO   |     | NULL    |                |
  7. | activo       | tinyint(1)          | NO   |     | 1       |                |
  8. +--------------+---------------------+------+-----+---------+----------------+
  9.  
  10. MariaDB [mydb]> DESC puestos;
  11. +-----------------+----------------------+------+-----+---------+----------------+
  12. | FIELD           | TYPE                 | NULL | KEY | DEFAULT | Extra          |
  13. +-----------------+----------------------+------+-----+---------+----------------+
  14. | puestos_id      | SMALLINT(3) UNSIGNED | NO   | PRI | NULL    | AUTO_INCREMENT |
  15. | fk_companias_id | tinyint(3) UNSIGNED  | NO   | MUL | NULL    |                |
  16. | puesto          | VARCHAR(45)          | NO   | UNI | NULL    |                |
  17. | activo          | tinyint(1)           | NO   |     | 1       |                |
  18. +-----------------+----------------------+------+-----+---------+----------------+
  19.  
  20. MariaDB [mydb]> DESC actas;
  21. +------------------------+--------------------------------+------+-----+---------+-------+
  22. | FIELD                  | TYPE                           | NULL | KEY | DEFAULT | Extra |
  23. +------------------------+--------------------------------+------+-----+---------+-------+
  24. | acta_id                | VARCHAR(25)                    | NO   | PRI | NULL    |       |
  25. | fk_fiscales_fis_cedula | VARCHAR(11)                    | NO   | MUL | NULL    |       |
  26. | fk_entes_receptores_id | tinyint(3) UNSIGNED            | NO   | MUL | NULL    |       |
  27. | fk_puestos_id          | SMALLINT(3) UNSIGNED           | NO   | MUL | NULL    |       |
  28. | fk_usuarios_id         | INT(10) UNSIGNED               | NO   | MUL | NULL    |       |
  29. | tipo_acta              | enum('penal','administrativa') | NO   |     | NULL    |       |
  30. | fecha                  | DATE                           | NO   |     | NULL    |       |
  31. | f_creacion             | datetime                       | YES  |     | NULL    |       |
  32. | f_modificacion         | datetime                       | YES  |     | NULL    |       |
  33. | descripcion            | text                           | YES  |     | NULL    |       |
  34. +------------------------+--------------------------------+------+-----+---------+-------+

Al hacer:

Código MySQL:
Ver original
  1. concat_ws(' ', co.compania, ' Compañía: ', pu.puesto) 'name',
  2. count(ac.fk_puestos_id) 'data'
  3. FROM actas ac
  4. INNER JOIN puestos pu
  5. ON pu.puestos_id = ac.fk_puestos_id
  6. INNER JOIN companias co
  7. ON co.companias_id = pu.fk_companias_id
  8. WHERE pu.activo = 1 AND co.activo = 1
  9. GROUP BY name, YEAR(f_creacion), MONTH(f_creacion)
  10. LIMIT 0,5;

Obtengo:

Código SQL:
Ver original
  1. +------------------------------------------------+------+
  2. | name                                           |DATA |
  3. +------------------------------------------------+------+
  4. | Primera  Compañía:  Sub Frente Chino Palmasola |    4 |
  5. | Quinta  Compañía:   Zaraza                     |    2 |
  6. | Primera  Compañía:  chaguaramas                |    1 |
  7. | Primera  Compañía:  Sub Frente Chino Palmasola |    1 |
  8. | Tercera  Compañía:  Puesto Cabruta             |    1 |
  9. +------------------------------------------------+------+

primera Compañía: Sub Frente Chino Palmasola se muestra en dos oportunidades pues tiene actas cargadas en dos meses distintos.

¿Cómo puedo hacer que se muestren de esta forma? (suponiendo que hay más valores en data)

Código SQL:
Ver original
  1. +------------------------------------------------+---------+
  2. | name                                           | DATA    |
  3. +------------------------------------------------+---------+
  4. | Primera  Compañía:  Sub Frente Chino Palmasola | 4, 1, 3 |
  5. | Quinta  Compañía:   Zaraza                     | 2, 3    |
  6. | Primera  Compañía:  chaguaramas                | 1, 5, 6 |
  7. | Tercera  Compañía:  Puesto Cabruta             | 1       |
  8. +------------------------------------------------+---------+
Donde en data se agrupen las sumas de las actas cargadas por mes.

No se por donde comenzar, agradecería cualquier ayuda o idea.

Última edición por kurt_fj; 22/08/2015 a las 09:57 Razón: Un acento de más.