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 nombre,
idVendedor,
((SubVentas * totalVentas)/100) PorcDeVentas
p.idVendedor,
ven.nombre,
COUNT(p.idPedido
) SubVentas
, T2.totalVentas
pedidos p
vendedores ven
ON p.idVendedor
=ven.idVendedor
(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.