【问题标题】:SQL return only specific rows with specific statusSQL 仅返回具有特定状态的特定行
【发布时间】:2021-01-29 08:45:55
【问题描述】:

下面这张表有两列

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,因为它们都有 Active 和 Retired 状态。

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

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

谁能告诉我我做错了什么或者我缺少任何连接?

【问题讨论】:

  • 你的意思是只想从你的表中选择order_no = B的记录吗?

标签: sql sql-server string group-by having-clause


【解决方案1】:

您可以使用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

编辑 - 如果您希望订单具有任一“接收”和“订购”状态(不一定两者),那么条件充分:

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

【讨论】:

  • 只有一条记录时会中断。例如 Order_No Order_Status D Receiving ....它不显示 D 记录。我再次更新了问题。
  • @shanky:它按预期工作,即获取所有同时具有“接收”和“订购”状态的订单。这个订单没有两种状态,所以被过滤掉了。
  • 不,它不显示 D 和 E。我认为它是因为和条件。
  • @shanky:你不明白我的意思。我提供的查询搜索具有 both 状态的订单。 DE 两者都没有,它们只有两种状态之一。我根据您的要求编辑了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多