You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

关键说明:

  1. GuideLocationTravelerCounts:先统计每个导游在每个地点的独特游客数,用GuideID分组是为了避免同名导游的分组错误。
  2. GuideMaxTravelerCounts:单独计算每位导游的最高带客数,为后续筛选做准备。
  3. 最终关联查询:把统计结果和最大值关联,就能精准找出每位导游带客最多的地点(如果有多个地点并列第一,都会被显示出来)。

如果不需要显示没有带过任何游客的导游,可以把LEFT JOIN改成INNER JOIN,这样只会返回有行程记录的导游数据。

内容的提问来源于stack exchange,提问作者linda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:41:46