Ver Mensaje Individual
  #4 (permalink)  
Antiguo 21/07/2011, 19:59
Avatar de gnzsoloyo
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, 5 meses
Puntos: 2658
Respuesta: problema con consulta de promedio

Veamos los consejos básicos:
- No hagas subconsultas en los campos del SELECT si puedes evitarlo, no sólo harán la consulta más lenta, sino que además, si vas a usar las mismas condiciones en ellas y en el FROM, carece de sentido. para eso las pones en una tabla derivada
- Si estás buscando un rango de fechas, no uses DATETIMEs, usa DATEs, y usa BETWEEN en lo posible. Lo que pones de consulta fuerza a una conversión entre DATE y DATETIME, y usa bytes innecesariamente para las fechas del rango.
- No pongas la relación en el WHERE y no uses la coma para el JOIN. Los manuales lo ponen de ejemplo, pero es mucho más eficiente usar INNER JOIN y poner "ON valor = valor", ya que el FROM es optimizable por el parser y el WHERE no.
- El error de columna desconocida se da porque no puedes usar el alias creado en los campos del SELECT como nombre de campo en el mismo SELECT. Sólo puedes hacerlo si ese campo proviene de una subconsulta en el FROM. Tampoco se pueden usar en el WHERE los alias de las columnas del SELECT.
- Si estás iniciándote recién en SQL, no trates de hacer consultas extremadamente complicadas. Ya habrá tiempo para ello. Antes es preferible resolver cosas en la aplicación y no en la base, hasta que vayas adquiriendo pericia.
- Si usas un campo de relación entre dos tablas de modo que el valor sea el mismo (ejemplo: p1.idVendedor = ven2.idVendedor), no necesitas comparar contra ambos campos un valor dado. Es redundante, porque de como sólo devolverá los que coincidan entre tablas, basta con indicarlo sobre una de ellas.

La consulta en general que planteaste es demasiado complicada. Hazlo más simple. Tal vez algo así:

Código MySQL:
Ver original
  1.     nombre,
  2.     idVendedor,
  3.     ((SubVentas * totalVentas)/100) PorcDeVentas
  4.   (SELECT
  5.     p.idVendedor,
  6.     ven.nombre,
  7.     COUNT(p.idPedido) SubVentas,
  8.     T2.totalVentas
  9.   FROM
  10.     pedidos p
  11.     INNER JOIN
  12.     vendedores ven ON p.idVendedor=ven.idVendedor
  13.     JOIN
  14.     (SELECT COUNT(idPedido) totalVentas FROM pedidos WHERE DATE(p.fecha_crea) BETWEEN '2011-06-01' AND '2011-06-30') T2
  15.   WHERE DATE(p.fecha_crea) BETWEEN '2011-06-01' AND '2011-06-30'
  16.   AND ven1.idVendedor=4
  17.   GROUP BY ven.idVendedor) T1;
(yo lo haría más simple aún, pero te resultaría algo complicado si no conoces las variables de usuario de MySQL)
Por sobre todas las cosas: Trata de mantenerlo simple.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)