问题描述
我在下表中有两列
Order_No Order_Status
A Receiving
A Active
A Retired
A Ordering
B Receiving
B Ordering
C Active
C Retired
D Receiving
E Ordering
我想获取Order_no B,D和E记录,因为它的订单状态为(接收/订购)。应该过滤掉A和C,因为它们都具有“活动”和“退休”状态。
select ORDER_NUMBER
from table ror
where ror.use_Status
Order_Status not in ('Active','Retired')
and Order_Status in ('Receiving','Ordering').
任何人都可以告诉我我做错了什么,或者我缺少任何联接吗?
解决方法
您可以使用group by
和having
:
select order_no
from mytable
group by order_no
having max(case when status = 'Receiving' then 1 else 0 end) = 1
and max(case when status = 'Ordering' then 1 else 0 end) = 1
and max(case when status not in ('Receiving','Ordering') then 1 else 0 end) = 0
此短语为:获取所有同时具有“正在接收”和“正在订购”状态,而没有其他状态的订单。
如果给定的订单不能两次具有相同的状态,则可以having
进行一些简化:
having sum(case when status in ('Receiving','Ordering') then 1 else 0 end) = 2
and sum(case when status not in ('Receiving','Ordering') then 1 else 0 end) = 0
编辑-如果您想要具有 或“正在接收”和“正在订购”状态的订单(不一定都是两者),则可以选择一个条件就足够了:
having max(case when status not in ('Receiving','Ordering') then 1 else 0 end) = 0