Как найти магазины, покупателями которых являются только мужчины?

0

У меня есть эта схема:

ЧЕЛОВЕК (имя, пол)

ЧАСТОТЫ (Имя, Магазин)

У меня вопрос, как мне найти магазины, клиентами которых являются исключительно мужчины?

  • 1
    Можете ли вы предоставить пример данных?
  • 0
    Используйте запрос, который идентифицирует каждый магазин, в котором есть женщина-посетитель, и используйте предложение NOT IN, чтобы исключить их из таблицы Frequents . Попробуйте сначала, а затем обратитесь за помощью, это не сложный SQL
Теги:

5 ответов

1
Лучший ответ

Вы можете использовать следующее, используя GROUP BY с HAVING:

SELECT frequents.shop
FROM frequents LEFT JOIN person ON frequents.name = person.name 
GROUP BY frequents.shop
HAVING SUM(person.sex = 'female') = 0 AND SUM(person.sex = 'male') > 0

демо на dbfiddle.uk

0
select Shop from FREQUENTS,PERSON where FREQUENTS.Name = PERSON.Name and PERSON.Sex = 'men'
0

Если вы хотите исключительно мужчин, то я бы подумал:

SELECT f.shop
FROM frequents f JOIN
     person p
     ON f.name = p.name 
GROUP BY f.shop
HAVING MIN(p.sex) = MAX(p.sex) AND  -- all sex values are the same or NULL
       COUNT(p.sex) = COUNT(*) AND  -- no NULL values
       MIN(p.sex) = 'male'          -- the value is male

Эта версия не предполагает, что существует только два пола.

0
select shop
from
(select shop , (case when sex = 'Male' then 1 else 2 end)s_cnt
from frequents a11 
join person a12
on a11.name = a12.name
group by shop , (case when sex = 'Male' then 1 else 2 end)
) a11
group by shop
having sum(s_cnt) = 1
  • 1
    Пожалуйста, добавьте пояснения к своему ответу (не к разделу комментариев), чтобы другие могли извлечь из него урок
0

Например NOT EXISTS

select distinct shop
from frequents
where not exists (
    select 1
    from person
    where person.name = frequents.name and person.sex = 'female'
)

Однако в соответствии с этим тестом может быть лучше использовать подход IS NULL:

select distinct shop
from frequents
left join person on person.name = frequents.name and person.sex = 'female'
where person.name is null

Ещё вопросы

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