SQL запрашивает идентификатор клиента, который заказал оба продукта A и B - PullRequest
0 голосов
/ 12 ноября 2018

Возникли небольшие проблемы при попытке выяснить, как вернуть запрос клиента, который заказал и A, и B

enter image description here

Я ищу всех клиентов, которые заказывают как продукт A, так и продукт B

.

Ответы [ 5 ]

0 голосов
/ 12 ноября 2018

Другой способ, который я только что выяснил, был

SELECT CustomerID 
FROM table
WHERE product in ('a','b')
GROUP BY customerid
HAVING sum(case product ='a' then 1 else 0 end) > 0
    and sum(case when product ='b' then 1 else 0 end) > 0
0 голосов
/ 12 ноября 2018
SELECT CustomerID 
FROM table
WHERE product in ('a','b')
GROUP BY customerid
HAVING COUNT(distinct product) = 2

Обычно я не публикую ответы только по коду, но слов мало что может добавить к этому - запрос в основном объясняет себя

Вы также можете

HAVING max(product) <> min(product)

Возможно, стоит указать, что в запросах выполняется WHERE, с фильтрацией только по продуктам A и B. Затем выполняется GROUP BY, группируется клиент и подсчитывается различное количество продуктов (или получается минимальное и максимальное значения). , Затем выполняется HAVING, отфильтровывая только те, у которых есть 2 разных продукта (или получаются только те, в которых MIN, т.е. A, отличается от MAX, т.е. B)

Если вы никогда не сталкивались с HAVING, это логически эквивалентно:

SELECT CustomerID
FROM(
    SELECT CustomerID, COUNT(distinct product) as count_distinct_product
    FROM table
    WHERE product in ('a','b')
    GROUP BY customerid
)z
WHERE
     z.count_distinct_product = 2

В предложении HAVING вы можете ссылаться только на столбцы, упомянутые в группе по. Вы также можете ссылаться на агрегатные операции (например, подсчет / мин / макс) в других столбцах, не упомянутых в группе, по

0 голосов
/ 12 ноября 2018

Select customerid from table group by customerid having product like 'A' and product like 'B' или вы можете попробовать having count(distinct product) =2, это кажется более точным.Вся идея в группе обычного пользователя. Предположим, что 1, если у меня есть несколько баллов A и B (отдельный продукт), будет равно 2, иначе будет 1, поэтому ответ такой же, как и выше.

0 голосов
/ 12 ноября 2018

Я бы использовал коррелированный подзапрос с предложением HAVING, чтобы найти оба продукта в одном предложении WHERE.

SELECT
  t.Customer
FROM
  @t AS t
WHERE
  EXISTS
    (
      SELECT
        1
      FROM
        @t AS s
      WHERE
        t.Customer = s.Customer
        AND s.Product IN ('A', 'B')
      HAVING
        COUNT(DISTINCT s.Product) = 2
    )
GROUP BY
  t.Customer;
0 голосов
/ 12 ноября 2018

Я никогда не работал с SQLLite, но, поскольку в его спецификациях говорится, что это реляционная база данных, он должен разрешить следующий запрос.

select CustomerID
  from table t
 where exists (
       select *
         from table
        where CustomerID = t.CustomerID
          and Product  = 'A'
       )
   and exists (
       select *
         from table
        where CustomerID = t.CustomerID
          and Product  = 'B'
       )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...