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 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
编辑 - 如果您想要的订单具有 “正在接收”和“正在订购”状态(不一定是 both), 那么一个条件就够了:
having max(case when status not in ('Receiving', 'Ordering') then 1 else 0 end) = 0
下面有这个 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 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
编辑 - 如果您想要的订单具有 “正在接收”和“正在订购”状态(不一定是 both), 那么一个条件就够了:
having max(case when status not in ('Receiving', 'Ordering') then 1 else 0 end) = 0