客户数量超过平均水平的城市。子查询

时间:2020-08-16 03:53:30

标签: mysql sql count average having-clause

我有三个桌子

  • country_tableid int, country_name string
  • city_tableid int, city_name string, postal_code int, country_id int
  • customer_tableid 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

非常感谢任何帮助

3 个答案:

答案 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;
  • 我不是使用一次性连接所有三个表的方法,而是使用CTE联接了city表和customer表并获取了相关信息,例如country_id,city_name和no_of_customers。
  • 此后,剩下要做的就是从每个相应的country_id中获取country_name并选择no_of_cutomers大于平均值的记录。
  • 为了实现这一目标,我将CTE与国家/地区表一起加入以获得country_name,然后应用where子句来过滤所需的结果。