Sql server 同时使用ODER BY和DISTINCT时出现SQL Server问题
我有两个问题,第一个问题是我的两个计数。GroupID是一个字符串,它将产品放在一起(名称和年份放在一起),产品相同但大小不同。 如果我在tblReview中有三条评论,并且它们都有相同的GroupID,我想返回3条。我的问题是,如果我有三个产品的ProductID不同,但GroupID相同,并且我在GroupID中添加了三个Review,那么我得到了9次退货(3*3)。如果我只有一个产品具有相同的GroupID和三个评论,那么它就可以工作(1*3=3次返回) 第二个问题是,如果我有按案例排序的价格,我也必须添加按价格分组,然后我就没有得到我想要的明显效果。这只是为了显示具有唯一GroupID的产品 这是问题,希望有人能帮我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次返回) 第二个问题是,如果我有按案例排序的
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