我有三个桌子
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, city_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
非常感谢任何帮助
答案 0 :(得分: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”子句中添加了主键列,以便处理可能具有相同名称的城市/国家(在现实生活中确实如此)
表别名使查询更易于编写和读取
答案 1 :(得分:0)
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
答案 2 :(得分:0)
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, city_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;