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

Это то, что выглядеть рабочих таблиц:проблема Количество в SQL, когда я хочу результаты diffrent

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

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

GroupID является name_year продукта, экс Nike_2010. Один продукта может имеют различные размеры для Примера:

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. Если я добавлю обзор в Nike size 8, и добавлю один обзор в Nike size 10, я хочу получить 2 результата подсчета, когда я перечисляю продукты с различным GroupID. Теперь я получаю тот же счет на Обзоры и комментарии, и оба ошибаются.

Я использую DataList, чтобы показать все продукты с diffrent/уникальным GroupID, я хочу, чтобы это было так:

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

Все Reviewcounts, Commentcounts и среднее значение всех продуктов с тем же GroupID, тем Средняя работает отлично.

ответ

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

0

Для каждого продукта будет один ряд комментариев, поэтому оба COUNT(tblReview.GroupID) и COUNT(tblComment.GroupID) вернут number of products x number of comments для этой группы.

Еще один способ объяснить это, выполнив запрос без group by. База данных будет перебирать строки и увеличивать COUNT(tblReview.GroupID) для каждой строки, где tblReview.GroupID не является нулевым.

Одно из решений - использовать разные. Изменение ReviewCount на:

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

Если я добавлю DISTINCT, я получаю тот же результат по всем продуктам, 1 отзыв и 1 комментарий, если у меня есть хотя бы один продукт с комментариями и комментариями, иначе продукты не будут показаны вообще. Если я запустил его без DISTINCT, и если у продукта есть 3 размера, результаты будут 3 отзыва и три комментария, даже если их всего 1. – Nicklas

Смежные вопросы