SQL return 仅具有特定状态的特定行

SQL return only specific rows with specific status

下面有这个 table,有两列

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 记录,因为它的订单状态是 ( Receiving/Ordering )。它应该过滤掉 A 和 C,因为它们都具有 Active 和 Retired 状态。

我尝试了以下查询,但没有显示结果。

select ORDER_NUMBER
from table ror
where ror.use_Status 
Order_Status not in ('Active', 'Retired')
and Order_Status in ('Receiving', 'Ordering').

任何人都可以告诉我我做错了什么或者我遗漏了任何连接吗?

您可以使用 group byhaving:

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

编辑 - 如果您想要的订单具有 “正在接收”和“正在订购”状态(不一定是 both), 那么一个条件就够了:

having max(case when status not in ('Receiving', 'Ordering') then 1 else 0 end) = 0