如何解决客户数量超过平均水平的城市子查询
我有三个桌子
-
country_table
:id int,country_name string
-
city_table
:id int,city_name string,postal_code int,country_id int
-
customer_table
:id int,customer_name string,city_id id,customer_address string
我正在寻找一个答案,该答案将返回所有城市的顾客数量超过所有城市平均顾客数量的城市。对于每个这样的城市,返回国家名称,城市名称,客户数量。
输出应为
country_name,city_name,count
我尝试使用子查询,但出现错误
Select country_name,count(customer_name)
from country
inner join city on city.country_id = country.id
inner join customer on customer.city_id = city.id
where customer_name > (select avg(customer_name)
from customer
inner join customer on customer.city_id = city.id group by id)
group by 1,2
非常感谢任何帮助
解决方法
查询的联接逻辑看起来不错,但是子查询需要修复。我会这样写:
Select co.country_name,ci.city_name,count(*) no_customers
from city ci
inner join country co on co.id = ci. country_id
inner join customer cu on cu.city_id = ci.id
group by co.country_id,co.country_name,ci.city_id,ci.city_name
having count(*) > (
select count(*) / count(distinct cu1.city_id) from customer cu1
)
注意:
-
无需将
city
表带入子查询;您只能从“客户”表中获取所需的信息 -
我在“ group by”子句中添加了主键列,以便处理可能具有相同名称的城市/国家(在现实生活中确实如此)
-
表别名使查询更易于编写和读取
Select country.country_name,city.city_name,count(customer.customer_name)
from country
inner join city on city.country_id = country.id
inner join customer on customer.city_id = city.id
group by country.country_name,city.city_name
having count(customer.customer_name) >
(
Select count(customer.customer_name) / count(city.city_name) as avg_per_city
from city
inner join customer on customer.city_id = city.id
)
子查询可以更短:
Select count(*) / count(distinct city_id) from customer
,
with table1 as
(
select country_id,city_name,count(city_name) no_of_customers
from city inner join customer
on city.id=customer.city_id
group by city_name,country_id
)
select country_name,no_of_customers
from table1 inner join country
where no_of_customers >
(
select count(*)/count(distinct city_id) from customer
)
order by country_name;
- 我不是使用一次性连接所有三个表的方法,而是使用CTE联接了city表和customer表并获取了相关信息,例如country_id,city_name和no_of_customers。
- 此后,剩下要做的就是从每个相应的country_id中获取country_name并选择no_of_cutomers大于平均值的记录。
- 为了实现这一目标,我将CTE与国家/地区表一起加入以获得country_name,然后应用where子句来过滤所需的结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。