You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:32:53