SQL-запрос — во скольких странах у нас есть пользователи и во скольких странах у нас нет пользователей

#sql #sql-server #snowflake-cloud-data-platform

#sql #sql-сервер #снежинка-облако-платформа для передачи данных

Вопрос:

Нужен SQL-запрос, который ответит на этот вопрос.

Пожалуйста, сообщите нам, во скольких странах у нас есть пользователи и во скольких странах у нас нет пользователей. Это должно быть представлено в таблице в одной строке и двух столбцах (в одном указано количество стран, в которых у нас есть пользователи, а в другом-количество стран, в которых у нас нет пользователей).

У нас есть две таблицы: AllCountriesInTheWorld и AllUsers.

Таблица Все страны мира

идентификатор страны название страны
1 США
2 Франция
3 Италия
4 Португалия
5 Испания
6 Канада
7 Великобритания
8 Китай
9 Япония
10 Германия

Пользователи таблиц

идентификатор пользователя имя пользователя идентификатор страны
a1 Джон 4
b2 Джейн 6
c3 Тони 6
d4 Dan 9
e5 Дейв 1

Заранее большое спасибо, ребята!

Комментарии:

1. Ты что — нибудь пробовал?

Ответ №1:

Если вы ОСТАВИТЕ ПРИСОЕДИНИТЬСЯ к 2 таблицам по их общему ключу,
вы сможете получить все страны с пользователями или без них.

 select * from AllCountriesInTheWorld ctry left join AllUsers usr  on usr.country_id = ctry.country_id  
идентификатор страны название страны идентификатор пользователя имя пользователя идентификатор страны
1 США e5 Дейв 1
2 Франция нулевой нулевой нулевой
3 Италия нулевой нулевой нулевой
4 Португалия a1 Джон 4
5 Испания нулевой нулевой нулевой
6 Канада b2 Джейн 6
6 Канада c3 Тони 6
7 Великобритания нулевой нулевой нулевой
8 Китай нулевой нулевой нулевой
9 Япония d4 Dan 9
10 Германия нулевой нулевой нулевой

Если вы затем СГРУППИРУЕТЕСЬ ПО странам, то сможете ПОДСЧИТАТЬ, сколько идентификаторов пользователей есть в каждой стране.

 count(usr.user_id) as total_users  
идентификатор страны всего пользователей
1 1
2 0
3 0
4 1
5 0
6 2
7 0
8 0
9 1
10 0

Затем просто оберните это в CTE или подзапросе и используйте условную агрегацию для общего числа пользователей.

 ;with CTE_COUNTRIES as (  ...  ) select   sum(case when total_users gt; 0 then 1 else 0 end) as countries_with_users , sum(case when total_users = 0 then 1 else 0 end) as countries_without_users from CTE_COUNTRIES  
страны с пользователями страны без_пользователей
4 6