排除满足条件的记录
Excluding records where criteria meets
我有一组记录,我们在其中识别与客户相关的多个项目。
我的困境是,如果客户同时拥有这两种商品,那么我想排除该客户。
如果他们只有一件特定的商品,那么我想把它包括在内。
我将使用此代码创建视图,因此我正在尝试找到最佳方法。我可以尝试 Row_number()
来识别不同的记录,但我不确定这在这种情况下是否理想。
示例数据table:
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'
,我不想要。
我认为您需要澄清您的问题,但据我了解,您正在寻找 return 所有行,其中:
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 子句。
如果您想要 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
)
我有一组记录,我们在其中识别与客户相关的多个项目。 我的困境是,如果客户同时拥有这两种商品,那么我想排除该客户。
如果他们只有一件特定的商品,那么我想把它包括在内。
我将使用此代码创建视图,因此我正在尝试找到最佳方法。我可以尝试 Row_number()
来识别不同的记录,但我不确定这在这种情况下是否理想。
示例数据table:
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'
,我不想要。
我认为您需要澄清您的问题,但据我了解,您正在寻找 return 所有行,其中:
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 子句。
如果您想要 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
)