Sql опрос, который должен вернуть товары, которые были проданы более 400 раз, возвращает больше, чем - PullRequest
0 голосов
/ 22 марта 2020

Я создаю учебник на основе базы данных магазинов. Это практическая часть к уроку. Я пытаюсь получить список продуктов, у которых количество проданных товаров (qty) превышает 400. Что не так с кодом? Это должно работать просто отлично?

--Show products that have a sold items quantity more than 400
 Select prod_name, qty 
 From products, sales 
 Where products.prod_id in (select prod_id from sales 
 Group by prod_id having sum(qty)>400);

В результате я получаю продукты с количеством менее 400 раз. Я надеюсь, что изображение является достаточно хорошим индикатором.

Results:

Ответы [ 3 ]

3 голосов
/ 22 марта 2020

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

select p.prod_id, p.prod_name, sum(s.qty)
from products p join
     sales  s
     on p.prod_id = s.prod_id
group by p.prod_id, p.prod_name 
having sum(s.qty) > 400;

Примечания:

  • Никогда не используйте запятые в предложении FROM. Всегда используйте правильный, явный, стандартный , читаемый синтаксис JOIN.
  • Одной из основных проблем в вашем запросе является декартово произведение без фильтрации.
  • Агрегируйте по неагрегированным столбцам в SELECT, особенно если вы изучаете SQL.
  • У вас есть qty в SELECT. Следует подвести итог.
1 голос
/ 22 марта 2020

у вас нет агрегации и критериев соединения в основном запросе, но вам даже не нужен подзапрос:

select max(prod_name), products.prod_id, sum(qty) 
 from products 
 inner join sales on products.prod_id = sales.prod_id
 group by products.prod_id
 having sum(qty)>400;
0 голосов
/ 22 марта 2020

Я не думаю, что вам нужно использовать sum, так как вы пытаетесь сравнить значения qty для каждого продукта. Вы можете сделать having qty > 400.

 select prod_name, qty from products, sales 
 where products.prod_id in (select prod_id from sales 
 group by prod_id having qty >400);
...