Как получить количество и сгруппировать по стране в группе по sql-запросу

У меня есть таблица с такими данными:

Id | Country | Desktop_User | Mobile_User
------------------------------------------
1  | USA     | True          | False
2  | Brazil  | False         |            
3  | Mexico  |               | True
4  | India   | True          | True
5  |         | False         | True

Мне нужны данные типа отчета, где я могу получить общее количество для ВСЕХ "Desktop_User" TRUE и ВСЕХ "Mobile_User" TRUE группы по странам (учитывая, что некоторые записи могут иметь значение NULL для страны или столбца Desktop_User или Mobile_User. Примерно так:

Country    | Desktop_User | Mobile_User
------------------------------------------
USA        | 100          | 49
China      | 50           | 10
India      | 11           | 5
Brazil     | 11           | 0
Mexico     | 0            | 0
NO COUNTRY | 5            | 7

Я хочу, чтобы данные отсортированы по странам в алфавитном порядке - возможно ли это

Пока я создал этот запрос (ниже), но я думаю, что моя логика неверна в получении всех ИСТИН для настольных и мобильных пользователей и значений NULL.

И как лучше всего отсортировать данные?

SELECT DISTINCT Country    AS Country, 
       COUNT(Desktop_User) AS Desktop_User, 
       COUNT(Mobile_User)  AS Mobile_User
  FROM Contacts
 WHERE Desktop_User = 'True'
    OR Mobile_User  = 'True'
 GROUP BY Country

Не нужно делать ВЫБРАТЬ ОТЛИЧИТЕЛЬНЫЙ! Ваша GROUP BY не возвращает дубликатов.

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

Ответы 1

Ответ принят как подходящий

Попробуйте следующее:

select Country AS Country
,      SUM(case when Desktop_User = 'True' then 1 else 0 end) as Desktop_User_cnt
,      SUM(case when Mobile_User = 'True' then 1 else 0 end) as Mobile_User_cnt
FROM   Contacts
WHERE  ((Desktop_User = 'True') OR (Mobile_User = 'True'))
group by Country
Order by Desktop_User_cnt desc 

DISTINCT не нужен, когда вы группируете.

Добавьте else 0, чтобы получить сумму 0 вместо нуля для Бразилии и Мексики.

jarlh 02.05.2018 15:03

Спасибо @HoneyBadger и @jarih за быстрый ответ. Просто уточняю - мне нужен WHERE ((Desktop_User = 'True') OR (Mobile_User = 'True')), даже когда мы определяем истинное состояние в SUM?

kuml 02.05.2018 15:31

Я выполнил вышеуказанный запрос и кое-что заметил: когда я запускаю запрос, чтобы узнать, сколько стран у меня есть в базе данных, я получаю почти 100 стран (включая строку NULL) с этим запросом SELECT DISTINCT Country FROM Contacts, но когда я запускаю указанный выше запрос, мы обсуждаем, я получаю почти половину стран, например, около 50. Я вижу эту разницу, когда у нас есть условие считать нулевым для всех трех столбцов. Разве я не должен получить такое же количество стран, поскольку цель состоит в том, чтобы перечислить все возможные страны, их ИСТИННОЕ количество для столбцов настольных и мобильных устройств по каждой стране?

kuml 02.05.2018 15:41

Если вам нужен полный список стран, вы можете удалить предложение where. Вы должны те же страны, что и с SELECT DISTINCT Country FROM Contacts

HoneyBadger 02.05.2018 15:44

Это сработало, спасибо @HoneyBadger. Как лучше всего отсортировать данные? Итак, у нас есть максимальное количество наверху и минимальное внизу?

kuml 02.05.2018 16:28

Способ сортировки данных Только - использовать order by.

HoneyBadger 02.05.2018 16:35

Обязательно примите этот ответ, если он решил вашу проблему. Если у вас есть еще вопросы, советую задать новый вопрос, а не углубляться в него.

HoneyBadger 02.05.2018 16:36

Привет, @HoneyBadger, я принял этот ответ - Спасибо. Я пытаюсь использовать ORDER by, и он продолжает выдавать ошибку. Я добавляю это в конце ORDER BY COUNT(Desktop_User) DESC, и я также пробовал эти ORDER BY Country DESC и ORDER BY Desktop_User DESC. Ошибка - предложение ORDER BY недействительно.

kuml 02.05.2018 17:08

Можно просто сделать что-нибудь вроде order by SUM(case when Desktop_User = 'True' then 1 else 0 end)

HoneyBadger 02.05.2018 17:14

Просто попробовал, и я получаю ту же ошибку - The ORDER BY clause is invalid unless TOP is specified

kuml 02.05.2018 17:36

Вы, вероятно, используете его в подзапросе, вы не можете отсортировать подзапрос. Если у вас есть другие вопросы, задайте новый вопрос.

HoneyBadger 02.05.2018 17:38

Я в основном этим занимаюсь. select Country AS Country , SUM(case when Desktop_User = 'True' then 1 else 0 end) as Desktop_User , SUM(case when Mobile_User = 'True' then 1 else 0 end) as Mobile_User FROM Contacts WHERE ((Desktop_User = 'True') OR (Mobile_User = 'True')) group by Country SUM(case when Desktop_User = 'True' then 1 else 0 end). Конечно - я могу создать новую тему, но решил задать здесь вопрос, так как изначально включал в свой вопрос вопрос о сортировке. Если кто-то другой ищет такое же решение, он может получить ответы в одном месте.

kuml 02.05.2018 20:10

Привет, @HoneyBadger - Просто проверяете, ждете ли вы, что я создам новую тему для этого вопроса? Этот вопрос был в моем первоначальном запросе в этой теме.

kuml 03.05.2018 21:44

Извините я забыл. Я думаю, в вашем последнем запросе могла быть ошибка копирования прошлого. Группа по неверна, и нет порядка по. Я отредактировал свой ответ, чтобы показать, как делать заказ, обратите внимание, что я изменил псевдоним столбца.

HoneyBadger 03.05.2018 22:08

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