如何查询客户数≥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
相关产品推荐
相关产品推荐

