2010-07-10 2 views
1

У меня есть следующие таблицы.Нужна помощь при написании SQL-запроса

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

Country_table
Country_ID | Страна

Region_table
Регион_ID | Регион | Country_ID

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

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

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

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 ; 

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

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. 

ответ

4

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

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

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

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 
+0

@Gaby, так что вы говорите, что таблица клиентов не обязательно должна иметь регионы региона и страны? – Zaki

+2

Таблица клиентов не нуждается в них, если они находятся в таблице города. Строго таблица города не нуждается в стране, если у нее есть таблица регионов. Если вы сохраните избыточные данные, как это, рано или поздно ваша база данных будет содержать противоречия. –

+0

@ Zaki, да потому, что регион можно найти по городу, и страну можно найти в этом регионе .. это работает, потому что его клиент может принадлежать только одному городу, городу к одному региону и региону в одну страну .. Поэтому каждой таблице нужно только ссылаться на родительский, а другой нет. –

2

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

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 
2

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; 
+1

Два 'AND' положения в запросе не нужны. – Oded

+0

Да, увлекся там, спасибо. Он был отредактирован. – LittleBobbyTables

Смежные вопросы