SQL子查询使用方法咨询:按导游统计带客最多的地点
解决SQL子查询问题:查找每位导游带客最多的地点
首先,咱们来分析一下你原来查询里的问题:你的HAVING子句逻辑有误——那个嵌套子查询没有对导游的各地点游客数做分组计算,直接返回的是该导游所有行程的原始数据,导致MAX()无法正确处理多行结果,而且也没关联到当前分组的游客数。另外,分组时只用FirstName可能会有同名导游的混淆,最好结合GuideID来分组。
下面是能实现需求的正确解法,我用CTE(公共表表达式)来拆解逻辑,这样更清晰易读:
WITH GuideLocationTravelerCounts AS ( -- 第一步:计算每个导游在每个地点的游客数量(去重,避免同一游客多次跟团的重复统计) SELECT G.GuideID, G.FirstName, L.LocationName, COUNT(DISTINCT T.TravelerID) AS number_of_travelers FROM Guides G LEFT JOIN Trips T ON G.GuideID = T.GuideID LEFT JOIN Locations L ON T.LocationID = L.LocationID GROUP BY G.GuideID, G.FirstName, L.LocationName ), GuideMaxTravelerCounts AS ( -- 第二步:计算每位导游带客数量的最大值(不管地点) SELECT GuideID, MAX(number_of_travelers) AS max_travelers FROM GuideLocationTravelerCounts GROUP BY GuideID ) -- 第三步:关联两个CTE,筛选出每位导游带客数等于其最大值的地点记录 SELECT GLTC.FirstName, GLTC.LocationName, GLTC.number_of_travelers FROM GuideLocationTravelerCounts GLTC JOIN GuideMaxTravelerCounts GMC ON GLTC.GuideID = GMC.GuideID AND GLTC.number_of_travelers = GMC.max_travelers ORDER BY GLTC.FirstName;
关键说明:
GuideLocationTravelerCounts:先统计每个导游在每个地点的独特游客数,用GuideID分组是为了避免同名导游的分组错误。GuideMaxTravelerCounts:单独计算每位导游的最高带客数,为后续筛选做准备。- 最终关联查询:把统计结果和最大值关联,就能精准找出每位导游带客最多的地点(如果有多个地点并列第一,都会被显示出来)。
如果不需要显示没有带过任何游客的导游,可以把LEFT JOIN改成INNER JOIN,这样只会返回有行程记录的导游数据。
内容的提问来源于stack exchange,提问作者linda
相关产品推荐
相关产品推荐

