Как сделать вложенную группу по запросу в SQL Server?

У меня есть следующий запрос, над которым я работаю, который включает в себя создание запроса, включающего вложенный результат записей, но я не уверен, как сделать группу подзапросов или возможно ли это вообще.

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, и любая помощь будет оценена по достоинству!

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте наборы для группировки

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<>.

Другие вопросы по теме