web-dev-qa-db-ja.com

平均よりも多くの顧客を持つ都市。副照会

3つのテーブルがあります

  • 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
Berk Yünür
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;
 _
  • 3つのテーブルすべてを1つのGOに参加させるのではなく、CTEを使用して市内テーブルと顧客のテーブルに参加し、関連情報I.e、Country_ID、CITEN_NAME、NO_OF_CUSTOMERSを使用しました。
  • この後、それに左のすべてのCountry_IDからcountry_nameを取得し、その平均よりも大きいNO_OF_COTOMERSを持つレコードを選択することです。
  • これを実現するために、COUNTLE_NAMEを取得するためにCTEにCDER_NAMEを取得し、WHERE句を適用して必要な結果をフィルタリングしました。
0
benluke5
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
 _
0
juergen d