Нужна помощь в написании SQL-запроса - PullRequest
1 голос
/ 10 июля 2010

У меня есть следующие таблицы.

Customer_table
Customer_ID |Фамилия |Имя |City_ID |Region_ID |Country_ID

Country_table
Country_ID |Страна

Region_table
Region_ID |Регион |Country_ID

City_table
City_ID |Город |Region_ID |Country_ID

Мне нужно найти количество клиентов по городам, то есть для всех стран, для всех регионов в странах, для всех городов в регионе, мне нужно получить номер нет.клиентов в каждом городе.

Например, я написал следующий SQL, чтобы получить нет.клиентов в каждой стране:

SELECT a.country_id , b.country,count(*) 
FROM Customer_Table a INNER JOIN Country_Table b
ON a.country_id = b.country_id
GROUP BY b.country , b.country_id ;

и получить нет.клиентов в каждом регионе для конкретной страны:

SELECT a.region_id , b.region , count(*)
FROM Customers_table a INNER JOIN Region_Table b
ON a.region_id = b.region_id
WHERE a.country_id ='USA' AND b.country_id ='USA'
GROUP BY region_id , country ;

Мне нужно найти количество клиентов по городам, т. е. для всех стран, для всех регионов в странах, для всех городов врегион, мне нужно получить нет.клиентов в каждом городе, что-то вроде

Country | Region  |       City     | no.of customers
  USA   |   CA    |  San Francisco |    53
  USA   |   CA    |  Los Angeles   |    45
  USA   |   CA    |  Sacramento    |    16
  USA   |   WA    |  Seattle       |    46
  USA   |   WA    |  Olympia       |    9
  UK    | England |  London        |    89
  UK    | England |  Nottingham    |    71
  UK    | Wales   |  Cardiff       |    69
  UK    | Wales   |  Newport       |    23

  ..................and so on for other countries.

Ответы [ 3 ]

4 голосов
/ 10 июля 2010

Ваши таблицы содержат избыточную информацию

, поскольку они связаны, каждая таблица должна ссылаться только на своего прямого родителя, а не на всех родителей в иерархии.

, поэтому клиенту нужно указывать только город, город только регион, регион только страну

SELECT
    Country_Table.Country,
    Region_Table.Region,
    City_Table.City,
    Count(Customer_Id) AS Customers
FROM
    Country_Table
    INNER JOIN Region_Table ON Region_Table.Country_Id = Country_Table.Country_Id
    INNER JOIN City_Table ON City_Table.Region_Id = Region_Table.Region_Id
    INNER JOIN Customer_Table ON Customer_Table.City_Id = City_Table.City_Id
GROUP BY
    Country_Table.Country,
    Region_Table.Region,
    City_Table.City
2 голосов
/ 10 июля 2010

Для SQL Server:

SELECT Country, Region, City, COUNT(Customer_ID) as [no.of customers]
FROM Country_Table
INNER JOIN Region_Table ON Country_Table.Country_ID = Region_Table.Country_ID
INNER JOIN City_Table ON City_Table.Region_ID = Region_Table.Region_ID
INNER JOIN Customer_Table ON Customer_Table.City_ID = City_Table.City_ID
GROUP BY Country, Region, City;
2 голосов
/ 10 июля 2010

Попробуйте это:

select Country,Region,City,count(Customer_ID)
from Customer_table as cust
inner join  Country_table on Country_ID=cust.Country_ID
inner join Region_table on Region_ID=cust.Region_ID
inner join Region_table on City_ID=cust.City_ID
group by country,Region,City
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...