SQL 服务器 - 使用连接计算 AVG()

SQL Server - Calculate AVG() using Joins

我有出租车运输应用程序

每个 driver 都有一个行程,对于每个行程,可以有多个客户(出租车拼车)提供他们的反馈。

现在我想得到那些 driver 中获得超过 10 个五星级 (5*) 和至少 20% Five-star 评级的 driver他们从客户那里收到的总评分。

假设 driver 在过去 30 天内总共收到 40 条反馈,其中 16 条为 5 星评级,那么此 driver 已满足至少 10 条 5* 星的标准收视率和超过 20% 的 5* 收视率。这个 driver id 应该被获取。

SELECT TR.[DriverId]
    ,100.0 * AVG(CASE 
            WHEN FE.[Rating] = 5
                THEN 1.0
            ELSE 0
            END) AS Percentage
FROM tblFeedback FE
LEFT OUTER JOIN tblTrip TR ON FE.TripId = TR.TripId
WHERE FE.DATE >= GETDATE() - 30
    AND FE.Rating = 5
GROUP BY DriverId
HAVING COUNT(CASE 
            WHEN FE.[Rating] = 5
                THEN DriverId
            END) >= 10
    AND 100 * AVG(CASE 
            WHEN FE.[Rating] = 5
                THEN 1.0
            ELSE 0
            END) > 20

上面的查询显示所有已获取其 ID 的驱动程序的百分比为 100.000,即使那些 driver 的总百分比为 18% 的驱动程序也被获取并且它们的百分比显示为 100%。

这个查询完全搞砸了我的报告

我认为问题出在您的 WHERE 子句中。特别是这一行:

AND FE.Rating = 5

这会强制 tblFeedback table 仅 return 具有五星级评级的记录,因此在计算中仅使用五星级评级。尝试去掉那条线,看看计算结果是否更接近您的预期。

试试这个。您需要包括所有评分才能计算百分比:

SELECT r.[DriverId], 100.0*r.five_stars/r.total_ratings AS Percentage
FROM (
  SELECT TR.[DriverId]
    SUM(CASE WHEN FE.Rating =5 THEN 1 ELSE 0 END) AS five_stars,
    SUM(*) AS total_ratings
  FROM tblFeedback FE
  INNER JOIN tblTrip TR ON FE.TripId = TR.TripId
  WHERE FE.DATE >= GETDATE() - 30
  GROUP BY TR.DriverId) r
WHERE r.five_stars>=10
AND 100.0*r.five_stars/r.total_ratings>20.0;