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

Promedio y LEFT JOIN

Estas en el tema de Promedio y LEFT JOIN en el foro de Mysql en Foros del Web. Hola: Estoy trabajando en reportes, pues tengo el siguiente query: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original SELECT o0.id , o1.id , o2.id , o3.id , ...
  #1 (permalink)  
Antiguo 02/12/2010, 13:53
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 10 meses
Puntos: 12
Promedio y LEFT JOIN

Hola:

Estoy trabajando en reportes, pues tengo el siguiente query:
Código MySQL:
Ver original
  1. o0.id,
  2. o1.id,
  3. o2.id,
  4. o3.id,
  5. o4.id,
  6. IFNULL(AVG(t.evalua),0)
  7. FROM ss_objetive AS o0
  8. LEFT JOIN ss_objetive AS o1 ON o1.dp = o0.id
  9. LEFT JOIN ss_objetive AS o2 ON o2.dp = o1.id
  10. LEFT JOIN ss_objetive AS o3 ON o3.dp = o2.id
  11. LEFT JOIN ss_objetive AS o4 ON o4.dp = o3.id
  12. LEFT JOIN ss_tareas AS t ON t.idopera = o4.id
  13. WHERE o4.idges = 3 AND o4.tipo = 4 AND o4.idare = 65
  14. GROUP BY o4.id
Que me da el siguiente resultado:


pero yo necesito que me saque los promedios agrupados por o3.id, o2.id, o1.id y o0.id, como resultado de los promedios por la columna que lo anteceden, por ejemplo si modifico el
Código MySQL:
Ver original
  1. GROUP BY o4.id
a
Código MySQL:
Ver original
  1. GROUP BY o3.id
coincidentemente me da el siguiente resultado:

Pero si continuo modificando el GROUP BY al campo que le antecede
Código MySQL:
Ver original
  1. GROUP BY o2.id
el resultado es:

y esto es comprensible pues saca el promedio de la tabla ss_tareas pero yo necesito que los promedios el AVG lo realice desde el resultado de otro AVG, pero no encuentro el modo de resolverlo.

Podrían ayudarmen por favor
  #2 (permalink)  
Antiguo 02/12/2010, 15:33
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Promedio y LEFT JOIN

Sacar la media de la media, requeriría hacer una subconsulta que a su vez use el GROUP BY correspondiente.
Esto significa:
Código MySQL:
Ver original
  1. FROM    
  2.     (SELECT *
  3.     FROM
  4.         (SELECT
  5.             o0.id,
  6.             o1.id,
  7.             o2.id,
  8.             o3.id,
  9.             o4.id,
  10.             IFNULL(AVG(t.evalua),0)  media
  11.         FROM
  12.             ss_objetive AS o0
  13.             LEFT JOIN ss_objetive AS o1 ON o1.dp = o0.id
  14.             LEFT JOIN ss_objetive AS o2 ON o2.dp = o1.id
  15.             LEFT JOIN ss_objetive AS o3 ON o3.dp = o2.id
  16.             LEFT JOIN ss_objetive AS o4 ON o4.dp = o3.id
  17.             LEFT JOIN ss_tareas AS t ON t.idopera = o4.id
  18.         WHERE o4.idges = 3 AND o4.tipo = 4 AND o4.idare = 65
  19.         GROUP BY o4.id) T1
  20.     GROUP BY o3.id)T2
  21. GROUP BY o2.id;
__________________
¿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 03/12/2010, 07:06
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 10 meses
Puntos: 12
Respuesta: Promedio y LEFT JOIN

Gracias por tu respuesta gnzsoloyo.

Pero tengo ciertos problemas para correr la consulta, si no me equivoco estas son consultas anidadas. le hice algúnas modificaciones, en la misma hago algunas consultas:

Código MySQL:
Ver original
  1. SELECT * FROM     /* donde esta la tabla */
  2.     (SELECT  *   FROM     /* donde esta la tabla */
  3.         (SELECT
  4.             o0.id,
  5.             o1.id,
  6.             o2.id,
  7.             o3.id,
  8.             o4.id,
  9.             IFNULL(AVG(t.evalua),0) AS  media
  10.         FROM
  11.             ss_objetive AS o0
  12.             LEFT JOIN ss_objetive AS o1 ON o1.dp = o0.id
  13.             LEFT JOIN ss_objetive AS o2 ON o2.dp = o1.id
  14.             LEFT JOIN ss_objetive AS o3 ON o3.dp = o2.id
  15.             LEFT JOIN ss_objetive AS o4 ON o4.dp = o3.id
  16.             LEFT JOIN ss_tareas AS t ON t.idopera = o4.id
  17.         WHERE o4.idges = 3 AND o4.tipo = 4 AND o4.idare = 65
  18.         GROUP BY o4.id) AS T1    
  19.     GROUP BY o3.id) AS T2      /* podemos seleccionar o4.id ya que este campo esta en la consulta anidada */
  20. GROUP BY o2.id /* podemos seleccionar o4.id ya que este campo esta en la consulta anidada */
Esta consulta me bota el siguiente error:

Cita:
Duplicate column name 'id'
la verdad no entiendo los motivos del error, agradecría una aclaración
  #4 (permalink)  
Antiguo 03/12/2010, 07:57
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Promedio y LEFT JOIN

cada subconsulta debe devolver nombres de columna únicos, y tu estás poniendo el mismo nombre a cada uno. Te conviene usar Alias:
Código MySQL:
Ver original
  1. SELECT * FROM    
  2.     (SELECT  *   FROM    
  3.         (SELECT
  4.             o0.id ID0,
  5.             o1.id ID1,
  6.             o2.id ID2,
  7.             o3.id ID3,
  8.             o4.id ID4,
  9.             IFNULL(AVG(t.evalua),0) media
  10.         FROM
  11.             ss_objetive AS o0
  12.             LEFT JOIN ss_objetive o1 ON o1.dp = o0.id
  13.             LEFT JOIN ss_objetive o2 ON o2.dp = o1.id
  14.             LEFT JOIN ss_objetive o3 ON o3.dp = o2.id
  15.             LEFT JOIN ss_objetive o4 ON o4.dp = o3.id
  16.             LEFT JOIN ss_tareas t ON t.idopera = o4.id
  17.         WHERE o4.idges = 3 AND o4.tipo = 4 AND o4.idare = 65
  18.         GROUP BY o4.id) T1    
  19.     GROUP BY o3.id)  T2
  20. GROUP BY o2.id;
Le quito los AS porque como ya no son obligatorios (desde hace años), no los necesita.
__________________
¿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 03/12/2010, 10:00
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 10 meses
Puntos: 12
Respuesta: Promedio y LEFT JOIN

Tienes toda la razón, pero aún no puedo sacar la media de otra media, modifique algunos datos en la base para probarlos en:


Cuando agrupo de esta manera:
Código MySQL:
Ver original
  1. SELECT * FROM    
  2.     (SELECT  *   FROM    
  3.         (SELECT
  4.             o0.id ID0,
  5.             o1.id ID1,
  6.             o2.id ID2,
  7.             o3.id ID3,
  8.             o4.id ID4,
  9.             IFNULL(AVG(t.evalua),0) media
  10.         FROM
  11.             ss_objetive o0
  12.             LEFT JOIN ss_objetive o1 ON o1.dp = o0.id
  13.             LEFT JOIN ss_objetive o2 ON o2.dp = o1.id
  14.             LEFT JOIN ss_objetive o3 ON o3.dp = o2.id
  15.             LEFT JOIN ss_objetive o4 ON o4.dp = o3.id
  16.             LEFT JOIN ss_tareas t ON t.idopera = o4.id
  17.         WHERE o4.idges = 3 AND o4.tipo = 4 AND o4.idare = 65
  18.         GROUP BY ID3) T1    
  19.     GROUP BY ID3)  T2
  20. /*GROUP BY ID2;*/
Aqui están los resultados:


La agrupación debe ser por el ID3, ID2 e ID1, y extraer la media de otra media
  #6 (permalink)  
Antiguo 03/12/2010, 10:10
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Promedio y LEFT JOIN

Código MySQL:
Ver original
  1. SELECT ID0, ID1, ID2, ID3, ID4,  AVG(media) media   FROM    
  2.     (SELECT  ID0, ID1, ID2, ID3, ID4,  AVG(media) media   FROM    
  3.         (SELECT
  4.             o0.id ID0,
  5.             o1.id ID1,
  6.             o2.id ID2,
  7.             o3.id ID3,
  8.             o4.id ID4,
  9.             IFNULL(AVG(t.evalua),0) media
  10.         FROM
  11.             ss_objetive o0
  12.             LEFT JOIN ss_objetive o1 ON o1.dp = o0.id
  13.             LEFT JOIN ss_objetive o2 ON o2.dp = o1.id
  14.             LEFT JOIN ss_objetive o3 ON o3.dp = o2.id
  15.             LEFT JOIN ss_objetive o4 ON o4.dp = o3.id
  16.             LEFT JOIN ss_tareas t ON t.idopera = o4.id
  17.         WHERE o4.idges = 3 AND o4.tipo = 4 AND o4.idare = 65
  18.         GROUP BY ID3) T1    
  19.     GROUP BY ID3)  T2
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 03/12/2010, 13:40
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 10 meses
Puntos: 12
Respuesta: Promedio y LEFT JOIN

Tema resuelto, muchas gracias.

Etiquetas: join, left, promedio
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 07:42.