不包括符合条件的记录

时间:2019-03-05 22:32:45

标签: sql sql-server row-number

我有一组记录,在这些记录中,我们确定了与客户相关的几个项目。 我的困境是,如果一个客户同时拥有这两个项目,那么我想排除该客户。

如果他们只有一项特定的项目,那么我想将其包括在内。 我将使用此代码创建视图,因此我试图找到最佳方法。我可以尝试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 个答案:

答案 0 :(得分:1)

我认为您需要澄清您的问题,但是据我所知,您希望返回以下所有行:

1)客户有一个特定的商品(即商品ID 12,不包括客户D)

(2)他们总共只有一项,不包括客户C,因为他们有两项。

如果是这样,这就是我所拥有的:

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

编辑:我澄清了对OP问题的解释。我还在SQL Fiddle(http://sqlfiddle.com/#!5/b5f1f/2/0)上测试了我的解决方案,并相应地更新了WHERE子句。

答案 1 :(得分:1)

如果您希望拥有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 
)