SQL Server 2017:统计特定用户各评分次数并按日期过滤
解决SQL Server中特定用户评分统计及日期过滤的问题
看起来你已经有了基础的分组统计代码,我来帮你补充完整,实现特定用户的评分次数统计、日期过滤,同时正确统计重复的评分记录。
首先明确核心需求:针对单个特定用户,统计他给出的每个评分(1-10)的出现次数,并且支持按日期范围过滤数据。
基础版本(仅统计用户实际给出过的评分)
如果只需要展示该用户确实给出过的评分及其次数,直接在你的基础代码上添加WHERE子句即可:
SELECT Rating, COUNT(Rating) AS Count FROM dbo.tableName WHERE -- 指定要查询的特定用户ID,示例为101,可替换为目标ID UserID = 101 -- 日期范围过滤:原始数据是dd-MM-yyyy格式的字符串,需转换为DATE类型再比较 AND CONVERT(DATE, CreatedDate, 105) BETWEEN '2018-01-01' AND '2018-12-31' GROUP BY Rating -- 按评分排序让结果更直观 ORDER BY Rating;
完整版本(覆盖1-10所有评分,未给出的评分显示0)
如果需要确保1-10的所有评分都出现在结果里(即使用户没给过某个评分,计数显示为0),可以用CTE生成完整的评分范围,再通过左连接实现统计:
-- 生成1到10的完整评分列表 WITH RatingRange AS ( SELECT 1 AS Rating UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 ) SELECT rr.Rating, -- 左连接后未匹配的记录Rating为NULL,COUNT会自动统计为0 COUNT(t.Rating) AS Count FROM RatingRange rr LEFT JOIN dbo.tableName t ON rr.Rating = t.Rating AND t.UserID = 101 -- 特定用户ID -- 同样转换日期格式进行范围过滤 AND CONVERT(DATE, t.CreatedDate, 105) BETWEEN '2018-01-01' AND '2018-12-31' GROUP BY rr.Rating ORDER BY rr.Rating;
关键细节说明
- 日期格式处理:原始数据的
CreatedDate是dd-MM-yyyy格式的字符串,用CONVERT(DATE, CreatedDate, 105)可以将其转换为SQL Server可识别的DATE类型,保证日期比较的准确性(105是SQL Server对应dd-MM-yyyy的格式代码)。 - 重复数据统计:
COUNT(Rating)会自动统计该用户同一评分的所有重复记录,比如用户101有两条Rating=10的记录,结果里的Count就会显示2,完美满足重复数据的统计需求。 - 参数化建议:如果是在应用程序中使用,建议用参数(如
@TargetUserID、@StartDate、@EndDate)代替硬编码的值,避免SQL注入风险。
内容的提问来源于stack exchange,提问作者Ray_Hack
相关产品推荐
相关产品推荐

