MadMyche
оригинальный пост:
Мне нужно создать таблицу, в которой будет показано имя региона и количество стран внутри регионов.
Насколько я понимаю вам нужен двухколоночный результирующий набор подобный этому для тестовых данных которые я создал
DECLARE @Region TABLE (RegionID INT, RegionName NVARCHAR(32))
DECLARE @Countries TABLE (CountryID INT, CountryName NVARCHAR(32), RegionID INT)
INSERT @Region VALUES
(1, 'Asia')
, (2, 'Europe')
INSERT @Countries VALUES
(1, 'Japan', 1)
, (2, 'China', 1)
, (3, 'Germany', 2)
, (4, 'Italy', 2)
, (5, 'France', 2)
/* Query Results
RegionName | CountryCount
-----------|-------------
Asia | 2
Europe | 3
*/
RegionName находится только в таблице Region, а таблица Countries содержит все имена стран вместе с таблицей RegionID, чтобы связать ее обратно с таблицей Region. Таким образом, общим является столбец RegionID, так что это то, что нужно использовать для объединения таблиц вместе
FROM @Region r
INNER JOIN @Countries c ON r.RegionID = c.RegionID
Следующая часть уравнения заключается в том, что вам нужно сделать
Count
из названий стран
SELECT CountryCount = Count(c.CountryName)
FROM @Region r
INNER JOIN @Countries c ON r.RegionID = c.RegionID
/* Query Results
CountryCount
============
5
*/
Теперь вы также хотите, чтобы имя региона было включено, поэтому первое, что люди хотят сделать, это просто добавить его вот так
SELECT r.RegionName, CountryCount = Count(c.CountryName)
/* Query Results
ERROR: Column '@Region.RegionName' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
*/
Итак, чтобы сделать то, что вы хотите, мы добавим в
GROUP BY
пункт о группировке страны по регионам. Это даст нам этот код
SELECT r.RegionName, CountryCount = Count(c.CountryName)
FROM @Region r
INNER JOIN @Countries c ON r.RegionID = c.RegionID
GROUP BY r.RegionName
И запуск этого процесса даст результаты, которые я показал с помощью исходных деклараций таблиц и данных, которые я создал