2010-11-03 14 views
5

Estoy trabajando en este problema SQL:Problema de SQL con funciones agregadas en where cláusula

Muestra las órdenes de compra cuyo importe cobrado y cantidad real son diferentes. Muestre esto mostrando el número de orden de compra, el POAmount para cada orden de compra, el monto real (calculado al agregar los precios de todos los artículos en el pedido) y la diferencia entre los dos. Ordene los resultados para mostrar primero aquellos con las mayores diferencias.

estoy recibiendo el siguiente código cuando se ejecuta la instrucción SQL a continuación:

código de error-1, 42903 Estado SQL: No válido el uso de una función agregada.

select 
    purchaseorder.ponum, 
    purchaseorder.amount, 
    sum(poitems.quantity*poitems.unitprice), 
    purchaseorder.amount-sum(poitems.quantity*poitems.unitprice) 
from purchaseorder, poitems 
where 
    purchaseorder.ponum = poitems.ponum 
    and purchaseorder.amount!=sum(poitems.quantity*poitems.unitprice) 
group by 
    purchaseorder.ponum, 
    purchaseorder.amount 

Creo que es porque estoy usando una función de agregado en mi cláusula where.

¿Cómo puedo solucionar este problema ???

Gracias,

Respuesta

0

Esto es lo que funcionó para mí. ¡Gracias chicos!

select purchaseorder.ponum, 
    purchaseorder.amount, 
    sum(poitems.quantity*poitems.unitprice) as actual, 
    purchaseorder.amount - sum(poitems.quantity*poitems.unitprice) as "diff" 
FROM  purchaseorder 
JOIN  poitems ON (purchaseorder.ponum = poitems.ponum) 
GROUP BY purchaseorder.ponum, purchaseorder.amount 
HAVING purchaseorder.amount != sum(poitems.quantity * poitems.unitprice) 
order by "diff" desc 
+0

es 'cantidad' siempre mayor que' real'? de lo contrario, es posible que desee 'ordenar por ABS (diff)' o algo similar dependiendo de su sabor de SQL – tobyodavies

5

Prueba esto:

select 
    purchaseorder.ponum, 
    purchaseorder.amount, 
    sum(poitems.quantity*poitems.unitprice), 
    purchaseorder.amount-sum(poitems.quantity*poitems.unitprice) 
from purchaseorder, poitems 
where 
    purchaseorder.ponum = poitems.ponum 
group by 
    purchaseorder.ponum, 
    purchaseorder.amount 
having 
    purchaseorder.amount!=sum(poitems.quantity*poitems.unitprice) 
+0

que no hace el ordenamiento pidió - con la más alta diff primero;) – tobyodavies

2

no se puede tener un agregado en una cláusula where - eso es lo que having es para - el cambio a

select purchaseorder.ponum, 
     purchaseorder.amount, 
     sum(poitems.quantity*poitems.unitprice) as actual, 
     purchaseorder.amount - sum(poitems.quantity*poitems.unitprice) as diff 
from purchaseorder, 
     poitems 
where purchaseorder.ponum = poitems.ponum 
group by purchaseorder.ponum, 
     purchaseorder.diff 
having diff != 0 
order by ABS(diff) desc 
+0

gracias por ver que necesito que ordenó. Obtengo este error cuando uso su código: – novicePrgrmr

+0

Código de error -1, estado SQL 42X04: La columna 'DIFF' no está en ninguna tabla en la lista FROM o aparece dentro de una especificación de unión y está fuera del alcance de la unión especificación o aparece en una cláusula HAVING y no está en la lista GROUP BY. Si se trata de una sentencia CREATE o ALTER TABLE, 'DIFF' no es una columna en la tabla de destino. – novicePrgrmr

+0

ver si la edición funciona (acabo de hacer lo que el error dice que hacer, aún no probado: P) – tobyodavies

1

Parece debe usar la cláusula HAVING en su lugar:

SELECT ... 
FROM  purchaseorder 
JOIN  poitems ON (purchaseorder.ponum = poitems.ponum) 
GROUP BY purchaseorder.ponum, purchaseorder.amount 
HAVING purchaseorder.amount != sum(poitems.quantity * poitems.unitprice); 

La cláusula HAVING se aplica casi en último lugar, y se utiliza principalmente para filtrar funciones de agregado. LIMIT se aplica después de HAVING.

Tenga en cuenta que el estándar SQL requiere que HAVING debe hacer referencia solo a columnas en la cláusula GROUP BY o columnas utilizadas en funciones agregadas. Sin embargo, MySQL admite una extensión a este comportamiento y permite que HAVING haga referencia a columnas en la lista SELECT y columnas en subconsultas externas también.

Como nota al margen, es posible que también desee utilizar una unión interna explícita allí (como se muestra en mi ejemplo) en lugar de la antigua sintaxis ANSI-89 que está utilizando.

Cuestiones relacionadas