web-dev-qa-db-fra.com

Comment éviter les erreurs "les fonctions d'agrégation ne sont pas autorisées dans WHERE"

Ce code SQL jette un 

les fonctions d'agrégat ne sont pas autorisées dans WHERE

SELECT o.ID ,  count(p.CAT)
FROM Orders o
INNER JOIN Products p ON o.P_ID = p.P_ID 
WHERE count(p.CAT) > 3
GROUP BY o.ID;

Comment puis-je éviter cette erreur?

33
D-Lef

Remplacez la clause WHERE par HAVING, comme ceci:

SELECT o.ID ,  count(p.CAT)
FROM Orders o
INNER JOIN Products p ON o.P_ID = p.P_ID 
GROUP BY o.ID
HAVING count(p.CAT) > 3;

HAVING est similaire à WHERE, les deux sont utilisés pour filtrer les enregistrements résultants mais HAVING est utilisé pour filtrer les données agrégées (lorsque GROUP BY est utilisé).

66
Aziz Shaikh

Utilisez la clause HAVING au lieu de WHERE

Essaye ça: 

SELECT o.ID, COUNT(p.CAT) cnt
FROM Orders o
INNER JOIN Products p ON o.P_ID = p.P_ID 
GROUP BY o.ID HAVING cnt > 3
5
Saharsh Shah

Est-ce que l'auto-joint va se lancer dans un jeté avec nous si nous avons une condition pour lister les prix supérieurs à la médiane des prix indiqués dans le tableau des commandes?

Par exemple. order_item, Order_Price 

Puisque les fonctions d'agrégat ne peuvent pas être utilisées dans une clause WHERE>

select a.order_item_product_price, count(distinct 
a.order_item_product_price) from 
default.order_items a , default.order_items b
where a.order_item_product_price = b.order_item_product_price
group by a.order_item_product_price
having a.order_item_product_price > appx_median(b.order_item_product_price)
order by a.order_item_product_price limit 10
0
user7872783