У меня есть следующий запрос, над которым я работаю, который включает в себя создание запроса, включающего вложенный результат записей, но я не уверен, как сделать группу подзапросов или возможно ли это вообще.
create table places (
id int not null identity primary key,
country varchar(32) not null,
continent varchar(32) not null,
hits int not null
);
insert into places (country, continent, hits) values
('Canada', 'North America', 8),
('Canada', 'North America', 5),
('United States', 'North America', 2),
('Germany', 'Europe', 5),
('Germany', 'Europe', 9),
('Germany', 'Europe', 1),
('France', 'Europe', 3),
('Italy', 'Europe', 6),
('Italy', 'Europe', 9),
('China', 'Asia', 7),
('China', 'Asia', 8),
('Japan', 'Asia', 7);
select country, count(*) as Total from places
group by country with rollup
order by country asc;
Этот запрос дает следующий результат:
(null) 12
Canada 2
China 2
France 1
Germany 3
Italy 2
Japan 1
United States 1
Я хотел бы, чтобы запрос давал результат, который выглядит следующим образом:
(null) 12
Asia 3
China 2
Japan 1
Europe 6
France 1
Germany 3
Italy 2
North America 3
Canada 2
United States 1
Вот ссылка на SQL Fiddle, чтобы поиграть с этим: http://sqlfiddle.com/#!18/9145b/2
Надеюсь, это возможно сделать в SQL Server, и любая помощь будет оценена по достоинству!


Используйте наборы для группировки
select coalesce (' ' + country, continent, 'TOTAL') item, count(*) as Total
from places
group by GROUPING sets((country, continent), (continent), ())
order by coalesce(continent, 'Z'), country asc;
Вы можете использовать grouping sets для агрегации. Получить правильный порядок немного сложно:
select coalesce(country, continent), count(*) as Total
from places
group by grouping sets ( (country), (continent), () )
order by (grouping(country) + grouping(continent)) desc, min(continent), grouping(continent);
Здесь — это рабочий пример db<>.