У меня есть это:
SELECT Product.ProductID, Product.Name, Product.GroupID, Product.GradeID,
AVG(tblReview.Grade) AS Grade
FROM Product left Join tblReview ON Product.GroupID = tblReview.GroupID
WHERE (Product.CategoryID = @CategoryID)
GROUP BY Product.ProductID, Product.Name, Product.GroupID, Product.GradeID
Я хотел бы возвратить только строки где продукт. Имя уникально. Если я делаю a SELECT DISTINCT
ProductID
отличается на каждой строке, таким образом, все строки уникальны.
Вы можете сделать что-то вроде этого (см. Ниже), но это предполагает, что вас не волнует, имеют ли два продукта с одинаковым именем разные GroupID, и т.д., потому что вы не можете перечислить их, если не используете другой подход (несколько запросов).
SELECT Product.Name
, max(Product.ProductID) as ProductID
, max(Product.GroupID) as GroupID
, max(Product.GradeID) as GradeID,
, AVG(tblReview.Grade) AS Grade
FROM Product left Join tblReview ON Product.GroupID = tblReview.GroupID
WHERE (Product.CategoryID = @CategoryID)
GROUP BY Product.Name
HAVING COUNT(distinct Product.Name) = 1
Должно ли это работать для вас?
SELECT Product.ProductID, Product.Name, Product.GroupID, Product.GradeID,
AVG(tblReview.Grade) AS Grade
FROM Product left Join tblReview ON Product.GroupID = tblReview.GroupID
WHERE (Product.CategoryID = @CategoryID)
GROUP BY Product.ProductID, Product.Name, Product.GroupID, Product.GradeID
HAVING COUNT(Product.Name)=1
SELECT p.ProductID, p.Name, p.GroupID, p.GradeID,
(
SELECT AVG(grade)
FROM tblReview r
WHERE r.GroupID = p.GroupID
) AS Grade
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY name ORDER BY productID) AS rna,
ROW_NUMBER() OVER (PARTITION BY name ORDER BY productID DESC) AS rnd
FROM Product
WHERE CategoryID = @CategoryID
) p
WHERE rna = rnd