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;
我有出租车运输应用程序
每个 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;