Ver Mensaje Individual
  #6 (permalink)  
Antiguo 27/05/2009, 20:49
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: Alguno me diria cual es mi problema

El tema no pasa por el EasyPhp o el WampServer (que usa PhpMyAdmin), sino por la versión del MySQL que tengas instalado y la forma de parsear la consulta.
En cualquier caso, es extraño que el EasyPhp te hubiese dado resultados, a menos que el mismo EasyPhp modificara la consulta al momento de enviarla al MySQL. Es raro, porque de entrada estaba mal escrita.

Veamos los dos detalles:

1. Lo que dice el profesor de los alias es simplemente una tontería. Puedes poner un alias a cada columna en una consulta de 36 columnas o más, y de todos modos funcionará, porque los alias no intervienen en el problema. Son nada más que suplantadores de nombre de columna (La única singularidad del caso es que el WHERE no los reconoce como nombres de columna, y tampoco se puede hacer lo mismo con el HAVING o usarlos para el GROUP BY si están en una función agregada, a menos que sean de una subconsulta).
2. El mensaje de error te lo dice todo: No se puede usar una función agregada (SUM(), AVG(), MAX(), MIN(), etc.) en una consulta donde una columna no tenga función agregada definida sin usar GROUP BY sobre esa columna.
Esto es porque las funciones de agregación generan un sólo resultado en una línea, siempre, mientras que esa columna genera más de uno. MySQL no sabe a qué linea van a corresponder los resultados obtenidos, o si se está pidiendo subtotales. Por eso requiere de la cláusula GROUP BY, para saber sobre qué criterio se realizarán los subtotales.
En tu caso, estás buscando la suma de facturas emitidas por los vendedores cuyo codigo sea igual a "LEP" (atención: no es que contenga, has escrito que sea igual a "LEP", porque no contiene los "%" para que busque los parecidos o que contengan eso).
Eso sería:
Código sql:
Ver original
  1. SELECT
  2.     v.Cod_Vend Codigo3,
  3.     SUM(f.Monto_Fact) Monto3
  4. FROM Vendedores AS v INNER JOIN Facturas f USING(Num_Fact) INNER JOIN VendFact vf USING(Cod_Vend)
  5. WHERE vf.Cod_Vend LIKE 'LEP';

Detalles:
1. No es buena idea usar "," (equivalente a JOIN) en la vinculación de tablas, a menos que estés seguro que los campos del mismo nombre en las diferentes tablas contengan el mismo tipo de dato. Si no es así, MySQL intentará hacer que se relacionen dos campos del mismo nombre entre dos tablas que contendrán datos de diferente tipo... dando lugar a errores.
2. Es de buen DBA usar INNER JOIN, LEFT JOIN o RIGHT JOIN, ya que son cláusulas que le permiten al MySQL hacer optimizaciones en el parseo.
3. Los "AS" en los alias son opcionales. No son obligatorios. Se quitó la obligación hace años y se conserva por compatibilidad con las versiones viejas.
4. Las relaciones entre los campos de dos tablas no se ponen en el WHERE sino en el FROM, sea usando "ON v.Num_Fact = f.Num_Fact" como USING(Num_Fact). Eso es fundamentalmente porque el parser de MySQL no puede optimizar lo que hay en el WHERE, pero si puede con lo que hay en el FROM.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)