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

如何查询客户数≥2的城市中的所有客户?

问题描述

现有Customers表,包含以下字段:

  • CustomerName
  • Country
  • City

需求:列出所有来自客户数量至少为2的城市的客户姓名。

初始尝试的SQL语句:

SELECT CustomerName, City
FROM Customers
GROUP BY City
HAVING COUNT(City) > 1

执行结果仅返回每个符合条件城市的首位客户(如纽约的Person A、洛杉矶的Person C),无法获取这些城市的全部客户。

而执行以下统计语句时,能正确统计出对应城市的客户数量(如纽约有3位客户、洛杉矶有5位客户):

SELECT COUNT(CustomerName), City
FROM Customers
GROUP BY City
HAVING COUNT(City) > 1

请问如何修正初始语句以满足需求?

解决方案

你之前的错误在于使用GROUP BY City会将同一城市的所有客户合并为一行,因此只能返回单个客户记录。要获取符合条件城市的全部客户,需要先筛选出客户数≥2的城市,再基于这些城市提取原表中的所有对应客户,以下是几种可行的修正方法:

方法1:子查询过滤

先通过子查询找出客户数量≥2的城市,再用这些城市作为条件过滤原表:

SELECT CustomerName, City
FROM Customers
WHERE City IN (
    SELECT City
    FROM Customers
    GROUP BY City
    HAVING COUNT(*) >= 2
)

方法2:窗口函数标记(适用于MySQL 8+、PostgreSQL、SQL Server等)

利用窗口函数COUNT() OVER (PARTITION BY City)计算每个城市的客户总数,再筛选总数≥2的记录:

SELECT CustomerName, City
FROM (
    SELECT 
        CustomerName, 
        City,
        COUNT(*) OVER (PARTITION BY City) AS city_customer_count
    FROM Customers
) AS temp_table
WHERE city_customer_count >= 2

方法3:JOIN关联查询

先统计符合条件的城市列表,再通过JOIN操作关联原表获取对应客户:

SELECT c.CustomerName, c.City
FROM Customers c
INNER JOIN (
    SELECT City
    FROM Customers
    GROUP BY City
    HAVING COUNT(*) >= 2
) AS qualified_cities ON c.City = qualified_cities.City

以上三种方法都能返回目标城市的所有客户,可根据你使用的数据库类型选择合适的写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:45:46