У меня есть таблица с такими данными:
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
Попробуйте следующее:
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 вместо нуля для Бразилии и Мексики.
Спасибо @HoneyBadger и @jarih за быстрый ответ. Просто уточняю - мне нужен WHERE ((Desktop_User = 'True') OR (Mobile_User = 'True'))
, даже когда мы определяем истинное состояние в SUM?
Я выполнил вышеуказанный запрос и кое-что заметил: когда я запускаю запрос, чтобы узнать, сколько стран у меня есть в базе данных, я получаю почти 100 стран (включая строку NULL) с этим запросом SELECT DISTINCT Country FROM Contacts
, но когда я запускаю указанный выше запрос, мы обсуждаем, я получаю почти половину стран, например, около 50. Я вижу эту разницу, когда у нас есть условие считать нулевым для всех трех столбцов. Разве я не должен получить такое же количество стран, поскольку цель состоит в том, чтобы перечислить все возможные страны, их ИСТИННОЕ количество для столбцов настольных и мобильных устройств по каждой стране?
Если вам нужен полный список стран, вы можете удалить предложение where. Вы должны те же страны, что и с SELECT DISTINCT Country FROM Contacts
Это сработало, спасибо @HoneyBadger. Как лучше всего отсортировать данные? Итак, у нас есть максимальное количество наверху и минимальное внизу?
Способ сортировки данных Только - использовать order by
.
Обязательно примите этот ответ, если он решил вашу проблему. Если у вас есть еще вопросы, советую задать новый вопрос, а не углубляться в него.
Привет, @HoneyBadger, я принял этот ответ - Спасибо. Я пытаюсь использовать ORDER by, и он продолжает выдавать ошибку. Я добавляю это в конце ORDER BY COUNT(Desktop_User) DESC
, и я также пробовал эти ORDER BY Country DESC
и ORDER BY Desktop_User DESC
. Ошибка - предложение ORDER BY недействительно.
Можно просто сделать что-нибудь вроде order by SUM(case when Desktop_User = 'True' then 1 else 0 end)
Просто попробовал, и я получаю ту же ошибку - The ORDER BY clause is invalid unless TOP is specified
Вы, вероятно, используете его в подзапросе, вы не можете отсортировать подзапрос. Если у вас есть другие вопросы, задайте новый вопрос.
Я в основном этим занимаюсь. 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)
. Конечно - я могу создать новую тему, но решил задать здесь вопрос, так как изначально включал в свой вопрос вопрос о сортировке. Если кто-то другой ищет такое же решение, он может получить ответы в одном месте.
Привет, @HoneyBadger - Просто проверяете, ждете ли вы, что я создам новую тему для этого вопроса? Этот вопрос был в моем первоначальном запросе в этой теме.
Извините я забыл. Я думаю, в вашем последнем запросе могла быть ошибка копирования прошлого. Группа по неверна, и нет порядка по. Я отредактировал свой ответ, чтобы показать, как делать заказ, обратите внимание, что я изменил псевдоним столбца.
Не нужно делать ВЫБРАТЬ ОТЛИЧИТЕЛЬНЫЙ! Ваша GROUP BY не возвращает дубликатов.