删除具有不同状态度的不需要的行
Remove unnecessary rows with different status degree
订单号
订单状态
560
0002
560
0016
560
0028
180
0002
180
0215
180
0485
所以订单状态数字代表不同的状态'比如0002表示订单对象被创建,0485表示订单已经完成等。我想要实现的是订单完成或取消,我不想要查看订单的任何其他状态,如对象创建。我有三个 table。我们称它们为 A、B 和 C。OrderNumber 来自 table A,OrderStatus 来自 table C。 table B 是我保留 OrderNo 和 OrderStat 的联合 table。
select A.OrderNumber, C.OrderStatus
from(A inner join B on B.OrderNo = A.OrderNo
inner join C on C.OrderStatus = B.OrderStat)
where A.OrderNumber in (this is where I need some help I think);```
您可以去CTE获取所有已完成的订单。现在,您可以在结果集中过滤这些订单,并仅显示已完成状态的已完成订单。
注意:根据问题内容,我只考虑了已完成的订单。您也可以通过添加已取消的订单状态将已取消的订单添加到 CTE。
;WITH CTE_CompletedCancelledOrders AS
(
SELECT OrderNumber, OrderStatus FROM B
WHERE B.OrderStatus = '0485' -- completedOrders
)
select A.OrderNumber, C.OrderStatus
from A inner join B on B.OrderNo = A.OrderNo
inner join C on C.OrderStatus = B.OrderStatus
WHERE NOT EXISTS (SELECT 1 FROM CTE_CompletedCancelledOrders
WHERE OrderNumber = A.OrderNumber) -- only incomplete Orders
UNION ALL
SELECT * FROM CTE_CompletedCancelledOrders -- completed Orders
最好的方法可能是 window 函数:
select o.*
from (select A.OrderNumber, C.OrderStatus,
sum(case when C.OrderStatus in ('0485', . . . ) then 1 else 0 end) over (partition by A.OrderNumber) as completed_or_canceled
from A inner join
B
on B.OrderNo = A.OrderNo inner join
C
on C.OrderStatus = B.OrderStat
) o
where completed_or_canceled = 0 or
OrderStatus in ('0485', . . . );
. . .
用于定义 completed/canceled 条件的状态。
订单号 | 订单状态 |
---|---|
560 | 0002 |
560 | 0016 |
560 | 0028 |
180 | 0002 |
180 | 0215 |
180 | 0485 |
所以订单状态数字代表不同的状态'比如0002表示订单对象被创建,0485表示订单已经完成等。我想要实现的是订单完成或取消,我不想要查看订单的任何其他状态,如对象创建。我有三个 table。我们称它们为 A、B 和 C。OrderNumber 来自 table A,OrderStatus 来自 table C。 table B 是我保留 OrderNo 和 OrderStat 的联合 table。
select A.OrderNumber, C.OrderStatus
from(A inner join B on B.OrderNo = A.OrderNo
inner join C on C.OrderStatus = B.OrderStat)
where A.OrderNumber in (this is where I need some help I think);```
您可以去CTE获取所有已完成的订单。现在,您可以在结果集中过滤这些订单,并仅显示已完成状态的已完成订单。
注意:根据问题内容,我只考虑了已完成的订单。您也可以通过添加已取消的订单状态将已取消的订单添加到 CTE。
;WITH CTE_CompletedCancelledOrders AS
(
SELECT OrderNumber, OrderStatus FROM B
WHERE B.OrderStatus = '0485' -- completedOrders
)
select A.OrderNumber, C.OrderStatus
from A inner join B on B.OrderNo = A.OrderNo
inner join C on C.OrderStatus = B.OrderStatus
WHERE NOT EXISTS (SELECT 1 FROM CTE_CompletedCancelledOrders
WHERE OrderNumber = A.OrderNumber) -- only incomplete Orders
UNION ALL
SELECT * FROM CTE_CompletedCancelledOrders -- completed Orders
最好的方法可能是 window 函数:
select o.*
from (select A.OrderNumber, C.OrderStatus,
sum(case when C.OrderStatus in ('0485', . . . ) then 1 else 0 end) over (partition by A.OrderNumber) as completed_or_canceled
from A inner join
B
on B.OrderNo = A.OrderNo inner join
C
on C.OrderStatus = B.OrderStat
) o
where completed_or_canceled = 0 or
OrderStatus in ('0485', . . . );
. . .
用于定义 completed/canceled 条件的状态。