【问题标题】:Single row selected as multiple rows in sql server单行被选为sql server中的多行
【发布时间】:2025-12-17 23:10:02
【问题描述】:

我不是编写 sql 查询的专家。我目前想出了一个存储过程。当我没有应用内部联接时,存储过程工作正常。我有两张桌子。

表 1:产品 表 2:产品评级

存储过程用于逐页选择记录。我是通过查阅在线文章创建的。下面会提到存储过程的主体,

SELECT ROW_NUMBER() OVER (ORDER BY [PostedDate] Desc)AS RowNumber,[Products].[Id], [Name], [Description], [PostedDate], 
           ISNULL(AVG([ProductRating].[RatingValue]), 0) AverageRating, COUNT([Rating].[RatingValue]) RatingCount
           INTO #DealResults1
           FROM [Products]
           LEFT OUTER  JOIN [Rating] ON [Product].[Id] = [Rating].[ProductId]
           WHERE [City] = CASE WHEN @CityId IS NULL THEN [City] ELSE @CityId END 
           AND [Description] IS NOT NULL  
           Group by [Products].[Id], [Name], [Description], [PostedDate], [Rating].[RatingValue]
           ORDER BY [PostedDate] Desc


           DECLARE @RecordCount1 INT
           SELECT @RecordCount1 = COUNT(*) FROM #ProductResults1

           SET @PageCount = CEILING(CAST(@RecordCount1 AS DECIMAL(10, 2)) / CAST(@PageSize AS DECIMAL(10, 2)))
           PRINT @PageCount

           SELECT * FROM #ProductResults1
           WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1

           DROP TABLE #ProductResults1

现在我承认我在加入方面很穷,我从来没有完全了解 Group by。

问题陈述: 当用户对产品进行评分时,每次都会在评分表中插入一条记录。现在,如果用户对 Product1 进行了三次评价,那么 Product 被选择了 3 次。有时两次。我不明白这个问题。请帮我解决这个问题。

【问题讨论】:

  • 可能PostedDate 列属于Rating 表,您将它用于GROUP BYclause。因此它将按评级重复产品,因为您有不同的日期/时间......
  • 仅按产品表中的列分组。您正在分组中添加 [Rating].[RatingValue]。示例:按 [Products].[Id]、[Name]、[Description]、[PostedDate] 分组
  • 谢谢你们。是的@Sandeep,在从 Group By 中删除 [Rating].[RatingValue] 之后,您就对了,现在问题已经解决了。我会更多地研究它以了解它。如果您可以将其发布为答案,那么我将能够将其标记为答案。如果您可以添加几行描述此行为,请多多关照。问候,

标签: sql asp.net sql-server stored-procedures


【解决方案1】:

仅按产品表中的列分组。您正在分组中添加 [Rating].[RatingValue]。 示例:

Group by [Products].[Id], [Name], [Description], [PostedDate] 

【讨论】:

    最近更新 更多