2010-05-22 7 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 

C'est ce que les tabels ressemblent:problème de comptage dans SQL quand je veux des résultats de tabels diffrent

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

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

GroupID est name_year d'un produit, ex Nike_2010. Un produit peut avoir des tailles diffrent pour 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 

Je n'obtenir le nombre droit dans mon tblReview et tblComment. Si j'ajoute une critique à Nike taille 8 et j'ajoute un avis à Nike taille 10 Je veux 2 résultats de compte quand j'énumère les produits avec différents GroupID. Maintenant, je reçois le même nombre de critiques et de commentaires et les deux sont faux.

J'utilise un datalist pour afficher tous les produits avec diffrent/GroupID unique, je veux que ce soit comme ceci:

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

Tous les Reviewcounts, Commentcounts et la moyenne de tous les produits avec le même GroupID, la La moyenne fonctionne très bien.

Répondre

0

Parce que vous ne spécifiez pas de critères qui rejoignent les tables, vous obtiendrez la catégorie que vous spécifiez en combinaison avec chacun de tblReview et tblComment (en fait une croix énorme jointure).

Votre AVG arrive juste à travailler hors de la chance.

Vous devriez essayer quelque chose comme ceci:

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 

Normalement, je ne voudrais pas utiliser les sous-requêtes et au lieu rejoindre corrélées à des sous-requêtes globales, mais cela est plus illustrative de votre problème.

+0

Merci beaucoup! Fonctionne très bien! – Nicklas

0

Il y aura une ligne de commentaire pour chaque produit, donc COUNT(tblReview.GroupID) et COUNT(tblComment.GroupID) renverront le number of products x number of comments pour ce groupe.

Une autre façon d'expliquer qui est en exécutant la requête sans group by. La base de données va itérer sur les lignes et augmenter COUNT(tblReview.GroupID) pour chaque ligne où tblReview.GroupID n'est pas null.

Une solution consiste à utiliser distincte. Changer le reviewCount à:

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

Si j'ajoute DISTINCT j'obtenir le même résultat sur tous les produits, 1 avis et 1 commentaire, si j'ai au moins un produit à la fois un commentaire et un examen par ailleurs aucun produit ne montrent pas du tout. Si je le lance sans le DISTINCT et si un produit a 3 tailles, les résultats sont 3 avis et 3 commentaires même s'il y en a seulement 1 de chaque. – Nicklas