2010-05-22 36 views
0
ALTER PROCEDURE GetProducts 
@CategoryID INT 

AS 

SELECT COUNT(tblReview.GroupID) AS ReviewCount, 
     COUNT(tblComment.GroupID) AS CommentCount, 
     Product.GroupID, 
     MAX(Product.ProductID) AS ProductID, 
     AVG(Product.Price) AS Price, 
     MAX (Product.Year) AS Year, 
     MAX (Product.Name) AS Name, 
     AVG(tblReview.Grade) AS Grade 

     FROM tblReview, tblComment, Product 

WHERE (Product.CategoryID = @CategoryID) 

GROUP BY Product.GroupID 

HAVING COUNT(distinct Product.GroupID) = 1 

這是tabels是什麼樣子的結果:計數問題,當我想從不同勢tabels

 **Product** |**tblReview** | **tblComment** 

     ProductID | ReviewID | CommentID 
     Name  | Description | Description 
     Year  | GroupID  | GroupID 
     Price  | Grade  | 
     GroupID     

羣ID是name_year一個產品,前Nike_2010的。一種產品可以有不同勢尺寸exampel:

ProductID | Name | Year | Price | Size | GroupID 

    1  | Nike | 2010 | 50 | 8 | Nike_2010 
    2  | Nike | 2010 | 50 | 9 | Nike_2010 
    3  | Nike | 2010 | 50 | 10 | Nike_2010 
    4  | Adidas| 2009 | 45 | 8 | Adidas_2009 
    5  | Adidas| 2009 | 45 | 9 | Adidas_2009 
    6  | Adidas| 2009 | 45 | 10 | Adidas_2009 

我沒有得到正確的計數我tblReview和tblComment。如果我將評論添加到耐克大小8,並且我將一個評論添加到耐克大小10,那麼當我列出具有不同GroupID的產品時,我想要2次計數結果。現在我對「評論和評論」也有同樣的看法,兩者都是錯誤的。

我用一個DataList顯示所有與不同勢/唯一的GroupID的產品,我希望它是這樣的:

______________ 
    |    | 
    | Name: Nike | 
    | Year: 2010 | 
    | (All Sizes) | 
    | x Reviews | 
    | x Comments | 
    | x AVG Grade | 
    |______________| 

所有Reviewcounts,Commentcounts和所有產品的平均使用相同的組ID,該平均工作很好。

回答

0

因爲你沒有指定其聯接表的任何標準,你會得到你在每tblReview和tblComment(實際上是一個巨大的交叉連接)的組合指定產品類別。

您的AVG只是碰巧運氣不佳。

你應該嘗試這樣的事:

SELECT (SELECT COUNT(*) FROM tblReview WHERE tblReview.GroupID = Product.GroupID) AS ReviewCount, 
     (SELECT COUNT(*) FROM tblComment WHERE tblComment.GroupID = Product.GroupID) AS CommentCount, 
     Product.GroupID, 
     MAX(Product.ProductID) AS ProductID, 
     AVG(Product.Price) AS Price, 
     MAX (Product.Year) AS Year, 
     MAX (Product.Name) AS Name, 
     (SELECT AVG(tblReview.Grade) FROM tblReview WHERE tblReview.GroupID = Product.GroupID) AS Grade 
     FROM Product 
WHERE (Product.CategoryID = @CategoryID) 
GROUP BY Product.GroupID 
HAVING COUNT(distinct Product.GroupID) = 1 

通常我不會使用相關子查詢,而不是加入到聚合子查詢,但這更說明你的問題。

+0

非常感謝!很棒! – Nicklas 2010-05-22 16:29:09

0

每個產品都會有一條註釋行,因此COUNT(tblReview.GroupID)COUNT(tblComment.GroupID)將返回該組的number of products x number of comments

解釋該問題的另一種方法是通過運行沒有group by的查詢。數據庫將遍歷行,併爲tblReview.GroupID不爲空的每行增加COUNT(tblReview.GroupID)

一個解決方案是使用不同的。更改ReviewCount到:

COUNT(DISTINCT tblReview.GroupID) AS ReviewCount, 
     ^^^^^^^^ 
+0

如果我添加DISTINCT,我會在所有產品上獲得相同的結果,1條評論和1條評論,如果我至少有一個產品同時有評論和評論,則不顯示任何產品。如果我在沒有DISTINCT的情況下運行它,並且如果產品有3種尺寸,則結果是3條評論和三條評論,即使只有1條也是如此。 – Nicklas 2010-05-22 11:44:00