SQL Server:如何添加5星评分占比25%的司机筛选条件
解决司机5星评分占比筛选的SQL问题
没问题,我来帮你搞定这个占比筛选的需求!你之前的查询只统计了5星订单的数量,但要计算占比,我们得同时拿到每个司机的总订单数和5星订单数,这样才能算出5星占总订单的比例。
为什么你之前用avg(DriverId)不对?
avg(DriverId)是计算司机ID的平均值,和订单占比完全不相关。占比的计算逻辑是「5星订单数 ÷ 总订单数」,所以必须先获取这两个关键数值再做除法。
解决方案:用子查询或CTE关联数据
这里提供两种清晰的写法,都能满足你的筛选条件(过去30天、5星数≥10、5星占比≥25%):
方法1:使用子查询
SELECT t.DriverId, f.FiveStarTrips, t.TotalTrips, CAST(f.FiveStarTrips AS FLOAT) / t.TotalTrips AS FiveStarPercentage FROM -- 先统计每个司机过去30天的总订单数 (SELECT DriverId, COUNT(*) AS TotalTrips FROM tblTripfeedback WHERE TripDate >= GETDATE() - 30 GROUP BY DriverId) t JOIN -- 统计5星订单数≥10的司机 (SELECT DriverId, COUNT(*) AS FiveStarTrips FROM tblTripfeedback WHERE Rating = 5 AND TripDate >= GETDATE() - 30 GROUP BY DriverId HAVING COUNT(*) >= 10) f ON t.DriverId = f.DriverId WHERE -- 筛选5星占比≥25%的司机 CAST(f.FiveStarTrips AS FLOAT) / t.TotalTrips >= 0.25
方法2:使用CTE(公共表表达式,代码更易读)
WITH DriverTotalTrips AS ( -- 统计每个司机过去30天的总订单数 SELECT DriverId, COUNT(*) AS TotalTrips FROM tblTripfeedback WHERE TripDate >= GETDATE() - 30 GROUP BY DriverId ), DriverFiveStarTrips AS ( -- 统计5星订单数≥10的司机 SELECT DriverId, COUNT(*) AS FiveStarTrips FROM tblTripfeedback WHERE Rating = 5 AND TripDate >= GETDATE() - 30 GROUP BY DriverId HAVING COUNT(*) >= 10 ) SELECT d.DriverId, d.FiveStarTrips, t.TotalTrips, CAST(d.FiveStarTrips AS FLOAT) / t.TotalTrips AS FiveStarPercentage FROM DriverFiveStarTrips d JOIN DriverTotalTrips t ON d.DriverId = t.DriverId WHERE CAST(d.FiveStarTrips AS FLOAT) / t.TotalTrips >= 0.25
关键细节说明
- 数据类型转换:用
CAST(xxx AS FLOAT)是为了避免整数除法(比如15÷20如果用整数计算会得到0,而不是0.75),确保得到正确的百分比数值。 - 你的示例验证:司机ID123总订单20,5星15,15÷20=0.75≥0.25,且5星数15≥10,会被成功筛选出来,符合你的奖励条件。
内容的提问来源于stack exchange,提问作者user3198688
相关产品推荐
相关产品推荐

