Показать результаты SQL-запроса на основе количества

0

Я ищу способ показать результаты запроса на основе подсчета. У меня есть следующее:

# Returns expected number
SELECT systems.hostname AS Hostname, systems.date AS "Last Checked In", count(systems2updates.2package) AS "Needed Updates" 
FROM systems2updates RIGHT JOIN systems on systems2updates.2hostname=systems.hostname 
GROUP BY systems.hostname;

# Shows all entires, including those with 0
SELECT systems.hostname AS Hostname, systems.date AS "Last Checked In", count(systems2updates.2package) AS "Needed Updates" FROM systems2updates 
RIGHT JOIN systems on systems2updates.2hostname=systems.hostname 
WHERE "Needed Updates" > 0 
GROUP BY systems.hostname;

# Returns nothing
SELECT systems.hostname AS Hostname, systems.date AS "Last Checked In", count(systems2updates.2package) AS "Needed Updates" 
FROM systems2updates RIGHT JOIN systems on systems2updates.2hostname=systems.hostname WHERE "Needed Updates" = 0 
GROUP BY systems.hostname;

Любая помощь была высоко оценена. Спасибо.

Теги:

2 ответа

0

Я предполагаю, что вы хотите возвращать строки, где значение COUNT больше определенного значения? В этом случае предложение HAVING является самым простым способом. Например:

SELECT sampleValue, COUNT(*)
FROM dbo.SomeTable
GROUP BY sampleValue
HAVING COUNT(*) > 5

Обратите внимание, что HAVING не работает хорошо, и вы можете посмотреть альтернативное решение, используя функцию ROW_NUMBER().

  • 0
    Я не могу перевести это в запрос с моими полями. Можете ли вы уточнить, пожалуйста?
  • 0
    Удалите объект MSSQL dbo из запроса. MySQL не поддерживает ROW_NUMBER () до MySQL версии 8.0 +, которая не является готовой к использованию струей.
Показать ещё 1 комментарий
0

WHERE ограничивает записи, которые вы используете. Результат агрегации "Needed Updates" в данный момент не существует. Если вы хотите отфильтровать результаты агрегации, используйте HAVING:

...
GROUP BY systems.hostname
HAVING "Needed Updates" = 0;

BTW: MySQL позволяет использовать псевдонимы столбцов в HAVING. Однако это не допускается в стандартном SQL, где вам нужно будет GROUP BY count(systems2updates.2package).

UPDATE: MySQL не всегда соответствует стандарту, когда речь заходит о цитатах. Имена псевдонимов в двойных кавычках могут быть взяты для строки MySQL. Лучше избегайте таких псевдонимов.

select 
  s.hostname as hostname, 
  s.date as last_checked_in, 
  count(su.2package) as needed_updates 
from systems s
left join systems2updates su on su.2hostname = s.hostname
group by s.hostname
having count(su.2package) = 0;
  • 0
    Это все равно возвращает все, независимо от количества «необходимых обновлений»:
  • 0
    Тогда это могут быть цитаты, указанные в ответе BWS. Двойные кавычки являются стандартными разделителями для псевдонимов, но в MySQL их можно считать разделителями строк в зависимости от определенных настроек. Лучше избегать псевдонимов, которые должны needed_updates кавычки, например, использовать needed_updates .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню