【发布时间】:2020-11-18 20:59:00
【问题描述】:
总结: 我有一个表,其中包含来自销售订单状态跟踪应用程序的以下字段 OpportunityID、SalesOrderID、CurrentStatus、PriorStatus、RevisionDateTime
我已经针对该表构建了一个视图,其中包含以下内容(使用 Lead 函数): OpportunityID,SalesOrderID,PriorStatus,CurrentStatus,startTime,endTime,duration(工作分钟)。
背景:
- Opportunity 和 SalesOrderID 之间存在 1:Many 关系
- 每个 SalesOrder 都独立于其他相关 SalesOrders 在工作流中进行处理
- 取消商机后,所有基础 SalesOrders 也将被取消。
- 任何时候,SalesOrder 都可以返回到工作流中的先前状态
需要: 我需要报告任何 SalesOrder 处于任何状态的总期间。
数据样本
soID | opportunityID | lastStatus | statusName | startTime | endTime
-----+---------------+------------+------------+------------------+------------------
1 | Q1234 | Open | Approved | 11/17/20 10:00AM | 11/17/20 02:00PM
2 | Q1234 | Open | Approved | 11/17/20 10:00AM | 11/17/20 02:00PM
3 | Q1234 | Open | Approved | 11/17/20 10:00AM | 11/18/20 10:00AM
1 | Q1234 | Hold | Approved | 11/20/20 12:00PM | 11/21/20 08:00AM
2 | Q1234 | Confirmed | Approved | 11/21/20 12:00PM | 11/22/20 02:00PM
鉴于上面的例子,我需要 2 行的结果,开始/结束时间如下:
1: 11/17/2020 10:00 AM / 11/18/2020 10:00 AM
2: 11/20/2020 12:00 PM / 11/22/2020 12:00 PM
我几乎可以肯定我必须使用存储过程来生成所需的结果,但我被卡住了。有什么指点吗?
为清晰起见进行修订:
- 唯一相关的“状态”字段是“状态名称”,忽略“最后状态”列。
- 所需的输出将包括 OpportunityID 以及开始和结束时间。
- 逻辑:
- SOID 1-3 对于初始实例都在同一时间开始,但在不同的时间结束。该实例的最小开始时间将是报告的开始时间(例如 11/17 @ 10 AM),该实例的最大结束时间将是报告的结束时间(11/18 @ 10 AM)。
- 第二个输出记录遵循相同的逻辑。
我看到一篇提到 dbfiddle 和 WOW 的帖子 - 希望这会让事情变得更容易。
https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=a5674f4a7125f53c0436f9daa0807226
【问题讨论】:
-
摩根,您能否澄清一下,您到底想报告什么?您的描述说“...报告任何 SalesOrder 处于任何状态的总期间...”。您的示例显示 3 个状态(未结、保留、已确认)、3 个销售订单(1、2、3),而输出只有两行。您是如何获得这些行的,“开始”和“结束”的逻辑是什么?值 1 和 2 是如何得出的?
-
您要按机会ID 或销售订单分组吗?不知道您的数据,我会假设前 3 条记录是一个机会,而后两条记录是另一个机会?
-
正确,按机会 ID 分组,但所有 5 条记录都针对同一个机会 - 这使得这变得复杂。
-
soID 来自更高级别的销售订单表吗?
-
TLDR 版本:肯定的。提供视图的桌子是静态的和平坦的。长版:我们有一个没有自动版本/审核历史记录的销售订单表。我们正在实施一个 SQL 触发器来创建审计历史记录,这样我们就可以跟踪过程中的哪些问题。除了时间戳之外,触发器还将新旧状态值缓存到自定义/平面表中。
标签: sql sql-server