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

Consulta con 2 INNER JOIN y GROUP BY

Estas en el tema de Consulta con 2 INNER JOIN y GROUP BY en el foro de Mysql en Foros del Web. Hola les cuento un poco lo que intento hacer sin éxito... tengo 3 tablas Cursos id_grupo / cliente 1 / pepe 2 / pepe Horas ...
  #1 (permalink)  
Antiguo 12/05/2015, 10:01
 
Fecha de Ingreso: abril-2003
Mensajes: 260
Antigüedad: 21 años
Puntos: 1
Consulta con 2 INNER JOIN y GROUP BY

Hola les cuento un poco lo que intento hacer sin éxito...
tengo 3 tablas

Cursos
id_grupo / cliente
1 / pepe
2 / pepe

Horas
id_hora / id_grupo / total (hs)
1 / 1 / 10
2 / 1 / 20

Alumnos
id_alumno / id_grupo / sector
1 / 1 / RRHH
2 / 1 / Legales
3 / 2 / RRHH

Lo que intento hacer es saber el valor total de horas dictadas en un cliente (todos sus cursos) agrupados por sector.

En el ejemplo tengo 2 Cursos, con un total de 30 hs
Donde el Curso 1 (10hs) tiene 2 alumnos y el Curso 2 (20hs) tiene 1 alumno.
Entonces

Dando como resultado por sector:

RRHH (25hs)
Legales (5hs)

Mi intento fue el siguiente:

Código MySQL:
Ver original
  1. SELECT h.horas, g.id, a.sector
  2. FROM horas h
  3. INNER JOIN grupos g ON g.id = h.id_grupo
  4. INNER JOIN alumnos a ON a.id_grupo = g.id
  5. GROUP BY a.sector

Lo que noto que me falta pero no se como hacer es que me cuente la cantidad de alumnos que tengo por grupo para poder hacer la division :S

Muchas gracias!!
__________________
Bye!
  #2 (permalink)  
Antiguo 13/05/2015, 06:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Consulta con 2 INNER JOIN y GROUP BY

Cita:
Lo que noto que me falta pero no se como hacer es que me cuente la cantidad de alumnos que tengo por grupo para poder hacer la division :S
Para eso no puedes agrupar sólo por secto, sino por grupo también. Por otro lado si lo que quieres es:
Cita:
saber el valor total de horas dictadas en un cliente (todos sus cursos) agrupados por sector
El ID del grupo es irrelevante en tu consulta, a menos que quieras saber cuantos grupos tiene el sector. En cuanto a las horas, se necesita´ria saber qué guardas en esa columna, si un numero o una hora, porque no es lo mismo.
En principio, nos podemos acercar así:
Código MySQL:
Ver original
  1. SELECT a.sector, COUNT(DISTINCT g.id) Grupos, COUNT(a.id_alumno) Alumnos
  2. FROM horas h
  3.   INNER JOIN grupos g ON g.id = h.id_grupo
  4.   INNER JOIN alumnos a ON a.id_grupo = g.id
  5. GROUP BY a.sector


Posdata: Está prohibido hacer UP en los hilos (ver pDU 2.4). Si lo ahces lo sposts se borran sin previo aviso, y eventualmente la repetición se considera una infracción.
Si el tema no es respondido lo que debes hacer es agregar los resutlados de nuevas pruebas que hayas realizado, e información que ayude a despertar interés en el hilo.
TYen en cuenta que si el tema se ve como limitado o recurrente, puede no llamar la atención.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 13/05/2015, 06:32
 
Fecha de Ingreso: abril-2003
Mensajes: 260
Antigüedad: 21 años
Puntos: 1
Respuesta: Consulta con 2 INNER JOIN y GROUP BY

Ok, sry gnzsoloyo.

Es verdad lo que comentas que no necesito el id del grupo. Con respecto a las horas son un nro, el cual deberia sumar.

Probe esto...

Código MySQL:
Ver original
  1. SELECT a.sector, COUNT(DISTINCT g.id) Grupos, COUNT(a.id_alumno) Alumnos, SUM(h.horas) TotalHs
  2. FROM horas h
  3.   INNER JOIN grupos g ON g.id = h.id_grupo
  4.   INNER JOIN alumnos a ON a.id_grupo = g.id
  5. GROUP BY a.sector

pero paraece que sum y count en la misma consulta no funciona... :(

Gracias!
__________________
Bye!

Última edición por Pelao; 13/05/2015 a las 06:50
  #4 (permalink)  
Antiguo 13/05/2015, 07:00
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Consulta con 2 INNER JOIN y GROUP BY

Cita:
pero paraece que sum y count en la misma consulta no funciona... :(
Las funciones agrupadas se pueden usar todas en la misma consulta sin ninguna restricción.
¿A qué te refieres con "no funciona"? ¿En qué sentido?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 13/05/2015, 08:46
 
Fecha de Ingreso: abril-2003
Mensajes: 260
Antigüedad: 21 años
Puntos: 1
Respuesta: Consulta con 2 INNER JOIN y GROUP BY

No da ningun error, pero no llego al resultado correcto.
El problema lo tengo al agrupar por Sector. Por que al contar la cantidad de alumnos agrupando por Sector me da mas de los que realmente figuran, en cambio si agrupo por Grupos la cantidad de alumnos es correcta, pero no puedo saber el total por Sector.
:(
__________________
Bye!
  #6 (permalink)  
Antiguo 13/05/2015, 09:16
 
Fecha de Ingreso: abril-2003
Mensajes: 260
Antigüedad: 21 años
Puntos: 1
Respuesta: Consulta con 2 INNER JOIN y GROUP BY

Agrego algo que puede llegar a ser util...si la consulta la hago por 1 solo grupo me funciona bien, el problema es cuando lo hago por varios grupos
__________________
Bye!
  #7 (permalink)  
Antiguo 13/05/2015, 09:36
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Consulta con 2 INNER JOIN y GROUP BY

Cita:
Iniciado por Pelao Ver Mensaje
No da ningun error, pero no llego al resultado correcto.
El problema lo tengo al agrupar por Sector. Por que al contar la cantidad de alumnos agrupando por Sector me da mas de los que realmente figuran, en cambio si agrupo por Grupos la cantidad de alumnos es correcta, pero no puedo saber el total por Sector.
:(
Pues alli tienes obviamente un caso donde un mismo alumno en un mismo sector,está apareciendo en más de un grupo.
Si la relacion fuese 1:1 entre alumno y grupo, no existirían más alumnos que los que hay en el sector...
Hay tres soluciones:
Código MySQL:
Ver original
  1. SELECT a.sector, g.id Grupo, COUNT(DISTINCT g.id) Grupos, COUNT(a.id_alumno) Alumnos, SUM(h.horas) TotalHs
  2. FROM horas h
  3.   INNER JOIN grupos g ON g.id = h.id_grupo
  4.   INNER JOIN alumnos a ON a.id_grupo = g.id
  5. GROUP BY a.sector, g.id;

Código MySQL:
Ver original
  1. SELECT a.sector, g.id Grupo, COUNT(DISTINCT g.id) Grupos, COUNT(a.id_alumno) Alumnos, SUM(h.horas) TotalHs
  2. FROM horas h
  3.   INNER JOIN grupos g ON g.id = h.id_grupo
  4.   INNER JOIN alumnos a ON a.id_grupo = g.id
  5. GROUP BY a.sector, g.id WITH ROLLUP;

Código MySQL:
Ver original
  1. SELECT a.sector, COUNT(DISTINCT g.id) Grupos, COUNT( DISTINCT a.id_alumno) Alumnos, SUM(h.horas) TotalHs
  2. FROM horas h
  3.   INNER JOIN grupos g ON g.id = h.id_grupo
  4.   INNER JOIN alumnos a ON a.id_grupo = g.id
  5. GROUP BY a.sector;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 13/05/2015, 11:52
 
Fecha de Ingreso: abril-2003
Mensajes: 260
Antigüedad: 21 años
Puntos: 1
Respuesta: Consulta con 2 INNER JOIN y GROUP BY

gnzsoloyo gracias x la ayuda...
el tema es el siguiente...necesito que al sumar las horas el valor este dividido en la cantidad de alumnos totales del grupo y recien despues agruparlo por sector...como podria hacer eso? ahi esta el error.
__________________
Bye!
  #9 (permalink)  
Antiguo 13/05/2015, 13:39
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Consulta con 2 INNER JOIN y GROUP BY

En realidad es muy fácil: Anidas las etapas de cálculo creando tablas derivadas (tablas resultado de subcosnutlas en el FROM):
Probemos:
Código MySQL:
Ver original
  1. SELECT sector, AVG((horas/alumnos)) horas_alumnos
  2.   SELECT a.sector, g.id Grupo, COUNT(a.id_alumno) Alumnos, SUM(h.horas) horas
  3.   FROM horas h
  4.     INNER JOIN grupos g ON g.id = h.id_grupo
  5.     INNER JOIN alumnos a ON a.id_grupo = g.id
  6.   GROUP BY a.sector, g.id) T1) T2
  7. GROUP BY  sector;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 14/05/2015, 07:38
 
Fecha de Ingreso: abril-2003
Mensajes: 260
Antigüedad: 21 años
Puntos: 1
Respuesta: Consulta con 2 INNER JOIN y GROUP BY

Gracias nuevamente,
me da un error de sintaxis:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT a.sector, g.id Grupo, COUNT(a.id_alumno) Alumnos, SUM(h.horas) horas FR' at line 2

:(
__________________
Bye!
  #11 (permalink)  
Antiguo 14/05/2015, 08:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Consulta con 2 INNER JOIN y GROUP BY

La idea basica es esa, te conviene verificar la sintaxis por ti mismo... Aprendes más de ese modo.
Código MySQL:
Ver original
  1. SELECT   sector, AVG (horas / alumnos) horas_alumnos
  2.     FROM (SELECT   a.sector, g.ID Grupo, COUNT (a.id_alumno) Alumnos, SUM (h.horas) horas
  3.               FROM horas h INNER JOIN grupos g ON g.ID = h.id_grupo
  4.                    INNER JOIN alumnos a ON a.id_grupo = g.ID
  5.           GROUP BY a.sector, g.ID) T1
  6. GROUP BY sector;

Te sugiero que descargues e instales una herramienta que tenga corrector sintáctico incorporado, como por ejemplo el MySQL Workbench. Te ayudará a resolver problemas como ese..
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: group, join, 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 05:58.