Исключая записи, где критерии соответствуют - PullRequest
1 голос
/ 06 марта 2019

У меня есть набор записей, в которых мы идентифицируем несколько предметов, связанных с клиентом.Моя дилемма в том, что если у покупателя есть оба товара, я бы хотел исключить этого покупателя.

Если у него есть только один конкретный товар, я бы хотел включить его.Я буду использовать этот код для создания представления, поэтому я пытаюсь найти лучший способ.Я мог бы попытаться Row_number() идентифицировать различные записи, но я не уверен, что это было бы идеально в этой ситуации.

Пример таблицы данных:

Customer | ItemID | value1 | Value2
   A         12       35       0
   B         12       35       0
   C         13       0        25
   C         12       0        25
   D         18       225       12

Желаемый вывод:

 Customer | ItemID | value1 | Value2
   A         12       35       0
   B         12       35       0

Это то, что у меня есть до сих пор:

select Customer, ItemID, Value1, Value2
from Table1 
where itemID = 12

Это дало бы мне клиента 'C', которого я не хочу.

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Если вы хотите, чтобы клиенты имели itemid = 12, но , а не itemid = 13, вы можете использовать NOT EXISTS:

select * from tablename t
where itemid = 12
and not exists (
  select 1 from tablename
  where customer = t.customer
  and itemid = 13
)

Если вы хотите, чтобы клиенты имели itemid = 12 и , а не любой другой itemid:

select * from tablename t
where itemid = 12
and not exists (
  select 1 from tablename
  where customer = t.customer
  and itemid <> 12
)

или

select * from tablename
where customer in (
  select customer from tablename
  group by customer
  having min(itemid) = 12 and max(itemid) = 12 
)
1 голос
/ 06 марта 2019

Я думаю, вам нужно уточнить ваш вопрос, но, насколько я понимаю, вы хотите вернуть все строки, где:

1) У покупателя есть конкретный товар (т. Е. Идентификатор товара 12, исключая покупателя D)

и

(2) У них всего один элемент, исключая клиента C, так как у них есть два элемента.

Если это так, то вот что у меня есть:

SELECT * 
FROM Table1
WHERE ItemID == '12' AND 
      Customer in (
                   SELECT Customer
                   FROM Table1
                   GROUP BY Customer
                   HAVING Count(Customer) = 1
                  )

Редактировать: Я разъяснил свою интерпретацию вопроса ОП. Я также проверил свое решение на SQL Fiddle (http://sqlfiddle.com/#!5/b5f1f/2/0) и соответственно обновил предложение WHERE.

...