【发布时间】:2018-07-30 14:28:34
【问题描述】:
我正在使用 ORACLE SQL,但遇到了一个难以解决的问题。
在我的系统中用户可以订购产品。这些订单可以处于不同的状态:WAITING、ACCEPTED、IN_PROGRESS、DELIVERED、REMOVED、DELETED。
这些订单记录在一个名为 tblorderlog 的表中。
该表包含以下列:OrderId、OrderState 和 OrderStateDate。
我想找出OrderStateDates 之间的天数差异,但问题是并非每个订单都经过每个订单状态,因此一个订单可能只来自WAITING、DELIVERED 和REMOVED。
无论州的顺序如何,有没有办法计算州之间的天数?
我做了什么:
select distinct susu.orderid, ol.orderstatedate, ol.orderstate,
case
when ol.orderstate = 'WAITING' then null
when ol.orderstate = 'ACCEPTED' then round(tblaccepted.orderstatedate-
tblwaiting,0)
when ol.orderstate = 'IN_PROGRESS' then round(tblinprogress.orderstatedate-tblaccepted.orderstatedate,0)
when ol.orderstate = 'DELIVERED' then round(tbldelivered.orderstatedate-tblinprogress.orderstatedate,0)
when ol.orderstate = 'REMOVED' then round(tblremoved.orderstatedate-tbldelivered.orderstatedate,0)
when ol.orderstate = 'DELETED' then round(tbldeleted.orderstatedate-tblremoved.orderstatedate,0)
else -10 --(Random number)
end as days_between_orderstates
from tblsusu susu
left join tblorderlog ol on susu.orderid = ol.orderid
left join (select ol.orderid, ol.orderstatedate
from tblorderlog ol
where ol.orderstate = 'WAITING') tblwaiting on susu.orderid = tblwaiting.orderid
left join (select ol.orderid, ol.orderstatedate
from tblorderlog ol
where ol.orderstate = 'ACCEPTED') tblaccepted on susu.orderid = tblaccepted.orderid
left join (select ol.orderid, ol.orderstatedate
from tblorderlog ol
where ol.orderstate = 'IN_PROGRESS') tblinprogress on susu.orderid = tblinprogress.orderid
left join (select ol.orderid, ol.orderstatedate
from tblorderlog ol
where ol.orderstate = 'DELIVERED') tbldelivered on susu.orderid = tbldelivered.orderid
left join (select ol.orderid, ol.orderstatedate
from tblorderlog ol
where ol.orderstate = 'REMOVED') tblremoved on susu.orderid = tblremoved.orderid
left join (select ol.orderid, ol.orderstatedate
from tblorderlog ol
where ol.orderstate = 'DELETED') tbldeleted on susu.orderid = tbldeleted.orderid
order by susu.orderid, ol.orderstatedate
我想要这样的输出:
orderid orderstate orderdate days_between_order_states
21 WAITING 22/07/18 NULL (or empty)
21 ACCPETED 24/07/18 2
21 DELIVERED 25/07/18 1
21 REMOVED 25/07/18 0
21 DELETED 26/07/18 1
25 WAITING 01/08/18 NULL (or empty)
25 DELIVERED 05/08/18 4
25 DELETED 06/08/18 1
..
..
【问题讨论】:
-
状态可以按任何顺序排列,不只是有些可以跳过?它们可以重复吗?请在您的问题中包含一些具有代表性的示例数据和预期结果(作为格式化文本,而不是图像)。
-
您绝对不需要对同一个表 (
tblorderlog) 进行那么多左连接,只需添加一个,在您的案例表达式中,您可以将其别名与orderstate列一起使用。 -
@JorgeCampos,你能举个例子吗?
-
当您按照@AlexPoole 的要求在问题中添加信息时,我可以。
-
@AlexPoole 感谢您的编辑,我在这里有点新。但这是预期的输出