Sql server 同时使用ODER BY和DISTINCT时出现SQL Server问题

Sql server 同时使用ODER BY和DISTINCT时出现SQL Server问题,sql-server,group-by,distinct,Sql Server,Group By,Distinct,我有两个问题,第一个问题是我的两个计数。GroupID是一个字符串,它将产品放在一起(名称和年份放在一起),产品相同但大小不同。 如果我在tblReview中有三条评论,并且它们都有相同的GroupID,我想返回3条。我的问题是,如果我有三个产品的ProductID不同,但GroupID相同,并且我在GroupID中添加了三个Review,那么我得到了9次退货(3*3)。如果我只有一个产品具有相同的GroupID和三个评论,那么它就可以工作(1*3=3次返回) 第二个问题是,如果我有按案例排序的

我有两个问题,第一个问题是我的两个计数。GroupID是一个字符串,它将产品放在一起(名称和年份放在一起),产品相同但大小不同。 如果我在tblReview中有三条评论,并且它们都有相同的GroupID,我想返回3条。我的问题是,如果我有三个产品的ProductID不同,但GroupID相同,并且我在GroupID中添加了三个Review,那么我得到了9次退货(3*3)。如果我只有一个产品具有相同的GroupID和三个评论,那么它就可以工作(1*3=3次返回)

第二个问题是,如果我有按案例排序的价格,我也必须添加按价格分组,然后我就没有得到我想要的明显效果。这只是为了显示具有唯一GroupID的产品

这是问题,希望有人能帮我

ALTER PROCEDURE GetFilterdProducts
@CategoryID INT, @ColumnName varchar(100)

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


FROM            Product LEFT JOIN
                         tblComment ON Product.GroupID = tblComment.GroupID LEFT JOIN
                         tblReview ON Product.GroupID = tblReview.GroupID


WHERE        (Product.CategoryID = @CategoryID)

GROUP BY Product.ProductID, Product.BrandID, Product.GroupID, Product.Name, Product.Year, Product.Price

HAVING COUNT(distinct Product.GroupID) = 1

ORDER BY
  CASE 
  WHEN @ColumnName='Name' THEN Name
  WHEN @ColumnName='Year' THEN Year
  WHEN @ColumnName='Price' THEN Price 
  END
我的标签:

产品: ProductID、名称、年份、价格、品牌ID、组ID

tblReview: ReviewID、描述、等级、ProductID、GroupID

TBL建议: CommentID、描述、ProductID、GroupID


我认为我的问题是,如果我有三个同名的GroupID,比如产品中的Nike_2010,我在tblReview中有三个评论,这三个评论计算包含Nike_2010的产品的第一行中有多少评论使用相同的GroupID,Nike_2010,然后是产品中包含Nike_2010的第二行,然后反复进行相同的计数,结果为9行。如何避免这种情况呢?

对于初学者来说,由于要连接多个表,因此最终会得到所有表的叉积。然后,计数将返回该列中包含数据的行总数。考虑下面的例子:

- PRODUCTS - -- COMMENTS -- --- REVIEWS --- Key | Name Key | Comment Key | Review 1 | A 1 | Foo 1 | Great 2 | B 1 | Bar 1 | Wonderful 将产生以下数据:

Key | Name | Comment | Review 1 | A | Foo | Great 1 | A | Foo | Wonderful 1 | A | Bar | Great 1 | A | Bar | Wonderful 2 | B | NULL | NULL 我会给你

Key | Name | Count1 | Count2 1 | A | 4 | 4 2 | B | 0 | 0 这将产生以下结果

Key | Name | NumComments | NumReviews 1 | A | 2 | 2 2 | B | 0 | 0 键|名称| NumComments | NumReviews 1 | A | 2 | 2 2 | B | 0 | 0

至于你提到的“独特效应”,我不太确定我是否理解。您能详细说明一下吗?

关于第二个问题-您不能按照相同的案例陈述进行分组吗?不过,在结果列表中不应该有价格字段。

如果您可以提供表模式和示例输入输出,那会很有帮助。……如果您得到三个具有相同组id和四个评审的产品,该怎么办?那么您希望看到多少行?如果它们具有相同的GroupID,我希望在4次评论中获得4次返回,即使ProductIDKey不同,我想我知道您在说什么,我将尝试一下。我的第二个问题是,当我列出产品时,我只想显示一次产品。如果我只显示一次具有唯一GroupID的产品。这将确保具有相同GroupID的产品(即具有相同名称和相同年份的产品具有相同的GroupID,它是相同的型号,只是长度不同)只显示一次。如果我按案例价格添加订单,那么我必须按产品添加组。价格也是如此。这就消除了明显的影响。如果我按价格添加GROUP BY Price,所有产品都会列出,即使它们具有相同的GroupID。我没有得到这部分:ISNULL(CommentCount.NumComments,0),ISNULL(ReviewCount.NumReviews,0)我是否必须创建两个新的选项卡来存储评论/评论的数量或发生了什么?@Nicklas CommentCount和ReviewCount不是新表,但它们引用了子查询,如
左外部联接(选择..从..)CommentCount ON..
。请查看了解子查询的更多帮助。我还认为您确实不了解
分组依据。您可以按价格分组,也可以按组id分组;你不能两者兼得。如果要按价格排序,则不能按其他内容分组,因为价格数据会消失。以价格分别为4和5的两种产品A和B为例。它们都有相同的组id。现在,如果按id分组,它们都会聚合在一起;该组的最终价格是多少?4.5.没办法知道。
Key | Name | Count1 | Count2
1   | A    | 4      | 4
2   | B    | 0      | 0
SELECT PRODUCTS.Key, PRODUCTS.Name, ISNULL(CommentCount.NumComments, 0),
       ISNULL(ReviewCount.NumReviews, 0)
FROM PRODUCTS
LEFT OUTER JOIN (SELECT Key, COUNT(*) as NumComments
                 FROM COMMENTS
                 GROUP BY Key) CommentCount on PRODUCTS.Key = CommentCount.Key
LEFT OUTER JOIN (SELECT Key, COUNT(*) as NumReviews
                 FROM REVIEWS
                 GROUP BY Key) ReviewCount on PRODUCTS.Key = ReviewCount.Key
Key | Name | NumComments | NumReviews 1 | A | 2 | 2 2 | B | 0 | 0