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

Promdio y LEFT JOIN

Estas en el tema de Promdio y LEFT JOIN en el foro de Mysql en Foros del Web. Hola: Tengo el siguiente Query: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original SELECT id , tarea , f_ini , f_fin , estado , AVG ( evalua ...
  #1 (permalink)  
Antiguo 29/10/2010, 15:47
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 3 meses
Puntos: 12
Promdio y LEFT JOIN

Hola:

Tengo el siguiente Query:

Código MySQL:
Ver original
  1. SELECT id,tarea,f_ini,f_fin,estado,AVG(evalua)
  2. FROM sipp.ss_tareas
  3. WHERE dp = 0
  4. AND idopera = 208

Lo que hace es sumar 4 registros en su campo evalua y me extrae el promedio en el último registro me envía el resultado y funciona, ahora intento aplicar esta misma lógina en otro Query más complejo:

Código MySQL:
Ver original
  1. SELECT o.id,o.objetivo,o.f_ini,o.f_fin,f.name,AVG(t.evalua)
  2. FROM sipp.ss_objetive AS o
  3. LEFT JOIN sipp.ss_form AS f ON f.formula = o.idges
  4. LEFT JOIN sipp.ss_tareas AS t ON t.idopera = o.id
  5. WHERE o.idare = 65 AND o.tipo = 4 AND o.estado = 'y'
  6. ORDER BY f.formula

Este Query me extrae datos que no son los correctos, debo realizar la misma operación que el anterior ejemplo pero enlazando con otras tablas y me salga en un campo específico "t.evalua" el promedio.

intenté ingresar AVG(SUM(t.evalua)), pero no funciona.

Algúna idea?
  #2 (permalink)  
Antiguo 29/10/2010, 23:01
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: Promdio y LEFT JOIN

Es posible que el orden de las tablas sea incorrecto.
El SQL es un lenguaje que realiza las cosas de modo que no se cumple la máxima de "el orden de los factores no altera el producto". Bueno, en este caso si lo altera.
En el SQL las tablas se leen normalmente de izquierda a derecha, de modo que si a la izquierda tienes la tabla con la menor cantidad de registros, o con pocos registros relacionados con la tabla siguiente, entonces los resultados obtenidos de la junta serán escasos, lo que hará que no se representen ciertos datos correctamente.

Lo que te conviene hacer es ordenar las tablas por jerarquía, de modo tal que a la izquierda esté la tabla primaria que contenga todos los items sobre los que se hará la consulta, y a la derecha las tablas dependientes de esa.
Si en el primer ejemplo estás poniendo la tabla SS_TAREAS, debo suponer que esa es la tabla principal y por tanto la sentencia debería ser mas o menos:

Código MySQL:
Ver original
  1.     o.id,
  2.     o.objetivo,
  3.     o.f_ini,
  4.     o.f_fin,
  5.     f.name,
  6.     AVG(t.evalua) evalua
  7.         sipp.ss_tareas t LEFT JOIN
  8.         sipp.ss_objetive o ON t.idopera = o.id LEFT JOIN
  9.         sipp.ss_form f ON o.idges  = f.formula
  10.     o.idare = 65 AND
  11.     o.tipo = 4 AND
  12.     o.estado = 'y'
  13. ORDER BY f.formula

Esta consulta te devolverá la media de `EVALUA`, de todas las tareas agrupadas por objetivos. Pero si alguna tarea no está relacionada con un objetivo, su valor será NULL y no se promediará ese objetivo, ya que las funciones de agregación no pueden sumar NULL, sino solamente los campos con valores reales.
Tal vez si explicas un poco mejor qué es lo que deseas obtener, podamos pensar en una forma más eficiente.
__________________
¿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 08/11/2010, 14:25
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 3 meses
Puntos: 12
Respuesta: Promdio y LEFT JOIN

Muchas gracias por tu respuesta, la verdad lo que deseo hacer es aminorar código y maximizar la velocidad. con tu respuesta entiendo mejor la consulta.

Etiquetas: join, left
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 08:16.