我正在开发一个ERP系统,该系统具有适用于不同业务流程的多个工作流程。在这个系统中,我可以访问供应商提供的视图,而不是所有底层表。每次记录进入并完成其中一个工作流程步骤时,都会有一个记录和时间戳记的日志表。
我想要做的是编写一个查询,显示以天为单位的时间,一个小数,每个记录在每个步骤中花费的时间。
在视图中我可以访问没有主键 - 它看起来像这样:
Record_id Workflow_id Workflow_Step_id Start_Date Result_Key Complete_Date
Record 1 1422 1 20-Feb-07 9:16:35 PM 7320 23-Mar-07 2:16:10 PM
Record 1 1422 2 23-Mar-07 2:16:10 PM 7320 23-Mar-08 3:13:30 PM
Record 1 1422 3 23-Mar-08 3:13:30 PM 7320 23-Mar-10 8:18:10 AM
Record 1 1422 4 23-Mar-10 8:18:10 AM 7320 23-Mar-13 4:06:57 PM
基本上Record_id是时间戳正在记录的记录,其中有数千个,并且它们不是唯一的,因为每次记录通过工作流程中的一个步骤时,它都会再次标记新记录。
Workflow_id就是记录所经历的工作流程(即采购订单,工程变更请求等) - 有多个工作流程,所以我需要过滤哪个工作流程用于最终结果
Workflow_Step_id让我知道这个时间戳正在反映的工作流程中的哪一步。
Result_Key是一种说“通过”或“被拒绝”的数字方式 - 在这种情况下,“7320”表示“通过”,这是我最感兴趣的(如果重要的话)。
Start_Date和Complete_Date是显而易见的,但这就是我正在尝试测量每个记录在整个工作流程中Workflow_Step_Id中每个步骤之间的时间。
理想情况下,这是我最终结果的样子,在适当的Workflow_id(1422)上过滤:
Record_id Step_1 Step_2 Step_3 Step_4
Record 1 30.0 1.0 10.4 3.2
Record 2 10.1 8.2 7.3 4.8
Record 3 2.1 4.1 8.4 6.1
(数学与我上面提供的数据不完全相同,这只是为了说明我希望最终结果看起来像什么。)
答案 0 :(得分:1)
您可以使用PIVOT
:
;WITH cte AS (SELECT Record_ID, Workflow_Step_ID,CAST(DATEDIFF(hour,Start_Date,Complete_Date)*1.0/24 AS DECIMAL(19,1)) AS Day_Diff
FROM Table1
)
SELECT *
FROM cte
PIVOT(MAX(Day_DIFF) FOR WorkFlow_Step_ID IN ([1],[2],[3],[4]))pvt
演示:SQL Fiddle
更新:您可以在查询末尾使用WHERE
子句根据已填充的[99]
字段进行拆分(成为透视输出中的字段,即:
;WITH cte AS (SELECT Record_ID, Workflow_Step_ID,CAST(DATEDIFF(hour,Start_Date,Complete_Date)*1.0/24 AS DECIMAL(19,1)) AS Day_Diff
FROM Table1
)
SELECT *
FROM cte
PIVOT(MAX(Day_DIFF) FOR WorkFlow_Step_ID IN ([1],[2],[3],[4],[99]))pvt
WHERE [99] IS NULL -- Returns all that weren't terminated, or `IS NOT NULL` for those that are terminated.
演示:SQL Fiddle
答案 1 :(得分:0)
我认为你正在寻找一个数据透视表,就像这些一样
SELECT Record_id, [1] Step1, [2] Step2, [3] Step3, [4] Step4
FROM (
SELECT Record_id, Workflow_Step_id, cast((Datediff(s, Start_Date, Complete_Date) / 86400.0) as decimal(5, 1)) as DayCnt
FROM tablename t) up
PIVOT (Max(DayCnt) FOR Workflow_Step_id IN ([1], [2], [3], [4])) AS pvt