为什么这个建议的解决方案更喜欢基于聚合计算百分比的不同方法?



我正在完成CMU公共数据库系统课程的一个问题集。我有以下两张表:

ShipCountry2012-07-042012-08-012012-07-1632012-07-052012-08-162012-07-10Toms Spezialitäten48

官方解决方案是一个非常糟糕的解决方案,因为它在同一个表Order上聚合两次,然后将结果连接起来,而通过单个聚合查询(如您的第一个查询)可以实现相同的结果。

我不能相信这将被提议作为这类问题的适当解决方案。
我希望这只是练习连接子查询

另外,看到表(或列)名/别名使用单引号,我感到非常失望。
这是一个非常糟糕的做法,它会导致意想不到的结果。
在需要的时候使用双引号,这是SQL的标准(方括号或反引号在SQLite中也可以使用)。

正如我所说,你的第一个查询是正确的,它可以通过使用聚合函数AVG()进一步简化:

SELECT S.CompanyName, 
ROUND(100*AVG(COALESCE(O.ShippedDate, '') > O.RequiredDate), 2) AS percent
FROM Shipper AS S JOIN "Order" AS O 
ON O.ShipVia = S.Id 
GROUP BY S.Id 
ORDER BY percent DESC;

注意在GROUP BY子句中使用了Id(它是Shipper的主键)而不是CompanyName

,这样可以提供更好的性能。此外,我使用COALESCE(),因为我发现(在下载您的数据库后)在列ShippedDate中有nulls。