Tengo una tabla que se llama protype, que tiene la siguiente estructura y contenido:
|---------------------------|
|id | process |
|---------------------------|
| 1 | Convocatoria |
| 2 | FUncionario |
| 3 | Designado |
| 4 | Cuadros |
| 5 | Contratos Determinados|
-----------------------------
Tengo otra tabla que se llama procesos, que tiene la siguiente estructura y contenido:
|------------------------------------------------------|
|id | year | protype | title | description |
|------------------------------------------------------|
| 1 | 2015 | 5 | Proceso 1 | Buen proceso |
| 2 | 2015 | 1 | Proceso 2 | Excelente proceso |
| 3 | 2015 | 1 | Proceso 3 | Terminado en tiempo|
| 4 | 2015 | 1 | Proceso 4 | Atrasado |
| 5 | 2015 | 1 | Proceso 5 | Faltan candidatos |
| 6 | 2015 | 2 | Proceso 6 | Candidatos externos|
| 7 | 2015 | 2 | Proceso 7 | Internos y externos|
| 8 | 2016 | 1 | Proceso 8 | Personal contratado|
| 9 | 2016 | 3 | Proceso 9 | Detenido |
|10 | 2016 | 5 | Proceso 10 | En proceso |
|11 | 2016 | 1 | Proceso 11 | Detenido |
|12 | 2016 | 2 | Proceso 12 | Avanzando |
--------------------------------------------------------
Necesito una consulta que me devuelva los siguientes resultados:
----------------------------------------
| tipo | 2015 | 2016 |
---------------------------------------|
| Contratos Determinados | 1 | 1 |
| Convocatorias | 4 | 2 |
| Cuadros | 0 | 0 |
| Designados | 0 | 1 |
| Funcionarios | 2 | 1 |
----------------------------------------
¿Cuál es la relación entre una tabla y la otra? ¿El campo "protype" de la segunda se corresponde con el "id" de la primera?
La segunda tabla está relacionada con la primera a través del campo protype, es decir, en ese campo se almacena el id del tipo de proceso de la primera tabla.
Lo que se quiere obtener como resultado de la consulta, es un listado con los tipos de proceso que se encuentran en la segunda tabla y la cantidad de los desarrollados por año; tal y como se muestra en la tabla 3.
Por una parte, olvidando la primera tabla, que es fácil de enlazar a posteriori, puedes obtener la cantidad de cada uno de los tipos de procesos (protype) que hay en un año usando un "COUNT(*)" y un "GROUP BY"
SELECT protype, count(*) AS cantidad2015
FROM procesos
WHERE year=2015
GROUP BY year, protype
Con eso obtendrías algo como
--------------------------
| protype | cantidad2015 |
--------------------------
| 1 | 4 |
| 2 | 2 |
| 3 | 0 |
| 4 | 0 |
| 5 | 1 |
--------------------------
¿Hasta ahí todo claro?
Confío en que sí. Para que en vez de aparecer el código de proceso se vea su descripción debes cruzar con la otra tabla. De paso, puedes usar un "alias" para que aparezca "tipo" en vez de "protype" como nombre del campo, así:
SELECT protype.process tipo, count(*) AS cantidad2015
FROM procesos, protype
WHERE year=2015 AND protype.id=procesos.protype
GROUP BY year, protype
Eso ya debería darte un resultado como
-----------------------------------------
| tipo | cantidad2015 |
-----------------------------------------
| Contratos Determinados | 1 |
| Convocatorias | 4 |
| Cuadros | 0 |
| Designados | 0 |
| Funcionarios | 2 |
-----------------------------------------
Ese resultado se parece mucho más. Hay dos diferencias: faltan los datos del año 2016 (¿seguro que debes mostrar los dos en la misma tabla?) y el nombre de campo es "cantidad2015", en vez de "2015", porque este último, tal como aparece en tu ejemplo, no es un identificador válido.
Nacho, muchas gracias por tu tiempo y responder y ayudarme.
En realidad necesito que aparezca en columnas, tantas columnas como años haya y su cantidad por tipo de procesos. Es para construir un gráficos de barras.
Vale, en ese caso puedes crear "al vuelo" nuevas columnas por cada año, de una manera un tanto trabajosa, usando las funciones "COUNT" e IF", así:
SELECT protype,
count(if(year=2015,id,null)) as 'cantidad2015',
count(if(year=2016,id,null)) as 'cantidad2016'
FROM procesos
GROUP BY protype;
(Sólo falta cruzarlo con la tabla PROCESOS para que aparezca el nombre de cada proceso en vez de su código).
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)