3

だから私はこれを1週間以上試してきましたが、動作させることができなかったので休ませましたが、これが私がやろうとしていることです。

データベースから製品を選択>LEFTOUTER 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が機能することを望みますが、残念ながら機能しません。これは何らかの方法で可能ですか?

ありがとう。

4

2 に答える 2

3

HAVING AVG(RATING.rating) > 3あなたの後に試してみてくださいGROUP BY

詳細については、MSDNのHAVINGを参照してください。

于 2013-01-30T10:04:58.683 に答える
1

HAVINGを使用する必要があります。このWHEREは、グループ化の前に結果セットをフィルタリングしますが、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
于 2013-01-30T10:05:42.057 に答える