COUNT函数结合DATEDIFF使用时计数异常的技术求助
问题分析与解决方案
我一眼就找到问题的根源啦!你的GROUP BY子句里包含了RENTALS.Rental_StartDay和RENTALS.Rental_EndDay,这会让每一条独立的租赁记录都被单独分组——毕竟不同租赁的起止日期大概率不一样,所以每组里只会有一条记录,COUNT(RENTALS.Boat_ID)自然就全是1了,完全达不到按品牌汇总租赁次数的目的。
另外,你需要的NumberofDaysRented应该是同一品牌下所有租赁的天数总和,而不是单条租赁的天数,所以得把DATEDIFF的结果用SUM()包裹起来。最后别忘了你要求的按RENTALS.Boat_ID排序,之前的ORDER BY COUNT(...) DESC不符合需求,得改成按船的ID排序。
修正后的SQL代码
SELECT BOATS.Boat_Brand, COUNT(RENTALS.Boat_ID) AS NumberofRentals, SUM(DATEDIFF(Day, RENTALS.Rental_StartDay, RENTALS.Rental_EndDay) + 1) AS NumberofDaysRented FROM RENTALS INNER JOIN BOATS ON RENTALS.Boat_ID = BOATS.Boat_ID GROUP BY BOATS.Boat_Brand, BOATS.Boat_ID -- 加Boat_ID避免重名品牌的船被错误合并 ORDER BY BOATS.Boat_ID; -- 按船ID排序,符合你的要求
为什么这样改?
GROUP BY BOATS.Boat_Brand, BOATS.Boat_ID:只按品牌和船ID分组(如果有不同船用同一品牌名的情况,这能避免错误合并),去掉了起止日期,这样同一品牌的所有租赁记录会被归为一组。SUM(DATEDIFF(...)+1):把每条租赁的天数加总,得到该品牌所有租赁的总天数,和你的预期结果一致。ORDER BY BOATS.Boat_ID:满足你要求的按RENTALS.Boat_ID排序的需求(关联后两边的BoatID是一致的)。
这样执行后,你就能得到和预期结果完全匹配的输出啦!
内容的提问来源于stack exchange,提问作者Chrystalline Rosenberg
相关产品推荐
相关产品推荐

