SQL LEFT JOIN,Average和WHERE

时间:2013-01-30 10:03:41

标签: sql sql-server-ce left-join average

所以我已经尝试了一个多星期了一点,我把它放在一边因为我无法让它工作但这就是我想要做的事情;

从数据库中选择产品>使用LEFT OUTER JOIN加载其评级并对其进行平均>使用INNER JOIN来获取不同的信息(不是很重要,但无论如何我会这么说)。

这是我的查询的简化(但准确)副本 - 原始版本很长,并且其中包含不同的语言单词,因此可能会有点混乱;

SELECT 
PRODUCT.name AS Name,
PRODUCT.price AS Price,
BRAND.name AS Brand,
AVG(RATING.rating) AS Rating
FROM PRODUCT
LEFT OUTER JOIN RATING ON RATING.product_id = PRODUCT.product_id
INNER JOIN BRAND ON BRAND.brand_id = PRODUCT.brand_id
GROUP BY PRODUCT.name, PRODUCT.price, BRAND.name

上述工作,但它错过了评级上的“过滤”。 我希望添加WHERE AVG(RATING.rating) > 3会起作用,但遗憾的是它没有。 这有可能做到吗?

感谢。

2 个答案:

答案 0 :(得分:3)

HAVING AVG(RATING.rating) > 3后尝试GROUP BY

有关详细信息,请参阅HAVING on MSDN

答案 1 :(得分:1)

您应该使用 HAVING clause WHERE clause 会在分组之前过滤结果集,而HAVING子句会在分组和聚合之后过滤最终结果集。因此,在WHERE子句中,您不能使用聚合(在这种情况下为AVG(RATING.rating)),而在HAVING中,您可以这样做。

SELECT 
PRODUCT.name AS Name,
PRODUCT.price AS Price,
BRAND.name AS Brand,
AVG(RATING.rating) AS Rating
FROM PRODUCT
LEFT OUTER JOIN RATING ON RATING.product_id = PRODUCT.product_id
INNER JOIN BRAND ON BRAND.brand_id = PRODUCT.brand_id
GROUP BY PRODUCT.name, PRODUCT.price, BRAND.name
HAVING AVG(RATING.rating) > 3