SQL problème avec les fonctions d'agrégation dans la clause where
Je suis en train de travailler sur ce problème SQL:
Montrer des ordres d'achat dont le montant facturé et le montant réel sont différents. Montrons par l'affichage du numéro de commande d'achat, le POAmount pour chaque bon de commande, le montant réel (calculé en additionnant le prix de tous les articles dans l'ordre), et la différence entre les deux. Trier les résultats montrent que ceux qui sont les différences les plus importantes en premier.
J'obtiens le code suivant lors de l'exécution de l'instruction sql ci-dessous:
Code d'erreur -1, SQL état 42903: Invalide l'utilisation d'une fonction d'agrégation.
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
Je pense que c'est parce que je suis en utilisant une fonction d'agrégation dans ma clause where.
Comment puis-je remédier à ce problème???
Merci,
OriginalL'auteur novicePrgrmr | 2010-11-03
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
OriginalL'auteur Jeff Hornby
Vous ne pouvez pas avoir un agrégat dans un
where
clause - c'est ce quehaving
est pour - changer deCode d'erreur -1, SQL état 42X04: la Colonne "DIFF' est pas dans une table de la liste ou s'affiche dans une jointure de spécification et est en dehors du champ d'application de la jointure de la spécification ou apparaît dans une clause HAVING et n'est pas dans la liste GROUP BY. Si c'est une création ou instruction ALTER TABLE puis 'DIFF' n'est pas une colonne dans la table cible.
voir si la modifier fonctionne (j'ai juste fait ce que l'erreur a dit de le faire, encore non testé :P)
OriginalL'auteur tobyodavies
Il semble que vous devez utiliser le
HAVING
clause de la place:La
HAVING
clause est appliquée presque à la dernière, et est là principalement pour le filtrage sur des fonctions d'agrégation.LIMIT
est appliqué aprèsHAVING
.Noter que la norme SQL exige que
HAVING
doit faire référence à des colonnes dans laGROUP BY
clause ou les colonnes utilisées dans des fonctions d'agrégation. Toutefois, MySQL prend en charge une extension de ce comportement, et permetHAVING
pour faire référence aux colonnes dans laSELECT
liste et les colonnes à l'extérieur de la sous-requêtes.Comme une note, vous pouvez également utiliser explicite d'une Jointure Interne (comme indiqué dans mon exemple) à la place de la vieille-ANSI-89 de la syntaxe que vous utilisez.
OriginalL'auteur Daniel Vassallo
Voici ce qui a fonctionné pour moi. Merci les gars!
amount
toujours plus grande queactual
? sinon, vous pourriezorder by ABS(diff)
ou quelque chose de similaire dépend de votre goût de SQLOriginalL'auteur novicePrgrmr