Как избежать ошибок "агрегированные функции не разрешены в WHERE"
Этот код sql генерирует
агрегированные функции не разрешены в 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;
Как избежать этой ошибки?
Ответы
Ответ 1
Замените предложение WHERE
на HAVING
, например:
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
похож на WHERE
, то есть оба используются для фильтрации результирующих записей, но HAVING
используется для фильтрации по агрегированным данным (когда используется GROUP BY
).
Ответ 2
Используйте предложение HAVING
вместо WHERE
Попробуйте следующее:
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
Ответ 3
Будет ли самосоединение идти за броском с объединением, где у нас есть условие, чтобы перечислять цены, которые больше, чем медианная из цен, перечисленных в таблице заказов?
Eg. order_item, Order_Price
Так как агрегатные функции не могут использоваться в предложении 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