Наличие утверждения и утверждения где приводят к противоречивым результатам в отношении данных покемонов - PullRequest
0 голосов
/ 30 мая 2020

это мой первый вопрос. Go пожалуйста!

Я работаю над проектом SQL в KhanAcademy . Мои исходные данные - это строки 1-181 этой базы данных покемонов (то есть все покемоны 1-го поколения), и я выполняю несколько запросов, касающихся статистики атак покемонов.

Запуск SELECT Type_1, COUNT(*) FROM pokemon WHERE "Attack" > 120 GROUP BY Type_1;, я получаю 15 Всего покемонов, сгруппированных по 9 различным типам, что я и ожидал.

Однако, когда я пытаюсь найти количество типов покемонов с хотя бы одним покемоном с более чем 120 Атака, она возвращает только 4 типа.

Это код: SELECT Type_1 AS "type" FROM pokemon GROUP BY type_1 HAVING "Attack" > 120;.

Чтобы показать пример, один покемон, которого не хватает во втором запросе, - это Machamp: INSERT INTO pokemon(Number,Name,Type_1,Type_2,Total,HP,Attack,Defense,Sp_Atk,Sp_Def,Speed,Generation,Legendary) VALUES (68,'Machamp','Fighting',NULL,505,90,130,80,65,85,55,1,'False');

Я не уверен, что не так в моем втором запросе. Пожалуйста, помоги, если можешь.

Ответы [ 2 ]

0 голосов
/ 30 мая 2020

Я пытаюсь использовать оператор HAVING, чтобы найти количество типов покемонов с хотя бы одним покемоном с более чем 120 атакой

Если вы хотите подсчитать, сколько типов покемонов имеют по крайней мере один покемон, у которого более 120 атак, тогда вы можете добавить еще один уровень агрегации поверх существующего запроса, например:

select count(*) no_types
from (select 1 from pokemon where attack > 120 group by type_1) t

Обратите внимание, что подзапрос использует select 1: мы не на самом деле нужно, чтобы он возвращал какой-то конкретный c столбец, все, что мы хотим знать, это сколько строк он содержит - отсюда select 1, что делает намерение явным.

Или мы могли бы использовать count(distinct), что позволяет избежать подзапроса:

select count(distinct type_1) no_types from pokemon where attack > 120
0 голосов
/ 30 мая 2020

Этот запрос:

SELECT Type_1 AS "type"
FROM pokemon
GROUP BY type_1
HAVING "Attack" > 120;

недействителен SQL и должен возвращать ошибку. Зачем? Поскольку HAVING занимает место после GROUP BY. И Attack не определяется. Это должно быть в функции активации, например:

HAVING MAX(Attack) > 120

Эта версия запроса логически эквивалентна:

SELECT p.type
FROM (SELECT Type_1 AS "type", MAX(Attack) as max_attack
      FROM pokemon
      GROUP BY type_1
     ) p
WHERE max_Attack > 120
...