[ Foro de SQL (y MySQL) ]

Ayuda sobre consulta

01-Apr-2016 19:44
Invitado ()
5 Respuestas

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  |
----------------------------------------


04-Apr-2016 00:03
Nacho Cabanes (+31)

¿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?


05-Apr-2016 13:51
Invitado ()

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.


10-Apr-2016 23:37
Nacho Cabanes (+31)

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.


11-Apr-2016 19:31
Invitado ()

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.


16-Apr-2016 17:32
Nacho Cabanes (+31)

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.)