SQL Server 2012.我需要创建一个查询来确定哪些作业在过去的任何给定日期处于哪种状态(BONUS:它们处于该状态的时间有多长)。SQL将行转换为列以跟踪作业状态
我有以下的列和结构的工作状态记录表:
JobStatusNo JobNo Status Rem Entered EnteredBy
-------------------------------------------------------------------------
1644897 420969 801 Reschedule 2017-09-20 17:58:18.503 1488
1644896 420969 812 Cancelled 2017-09-15 08:20:48.390 1267
1644895 420969 803 Confirmed 2017-09-14 10:13:25.733 1231
1644894 420969 802 Call Bob 2017-09-14 09:35:57.337 1231
1644893 420969 801 2017-09-08 18:18:16.490 1488
1644892 420965 807 2017-09-20 17:55:02.660 1488
1644891 420965 809 2017-09-20 17:47:52.340 1488
1644890 420965 806 2017-09-20 17:40:22.580 1488
1644889 420965 803 Confirmed 2017-09-20 17:05:30.870 1193
1644888 420965 801 2017-09-20 17:05:29.130 1193
1644877 420964 801 2017-09-20 17:02:16.830 1193
我想,我想有一个特定的任务数,然后每个状态它在,当(加我不不关心言论或谁进入工作):
JobNo 1Status 1Entered 2Status 2Entered
--------------------------------------------------------------
420969 801 2017-09-20 17:58:18.503 812 2017-09-15.337
420968 801 2017-09-20 17:55:02.660
420967 801 2017-09-20 17:47:52.340
420966 801 2017-09-20 17:40:22.580
420965 803 2017-09-20 17:05:30.870
420965 801 2017-09-20 17:05:29.130
420964 801 2017-09-20 17:02:16.830
...在指示3Status和3Entered等之后有更多列。我只需要为8个状态/输入的日期编码,因为这是作业在状态中被重新排序或替换的最多次数。如果最终有更多列,我将能够扩展我在这里得到的任何答案以包含该逻辑。
...因为我最终的答案将会在2016年7月1日(任何给定日期):87个职位为801职位,255个职位为806个职位,5个职位为809个职位。实际上,我需要做数学运算来确定每个职位的最终长度是否在特定状态,但由于这是我的第一个问题,我不知道我的答案会有多复杂,因此我在这里称之为“米猜测我可以找出其余的一旦我得到这些状态和DateDiff列日期。
我已经尝试过所有可以从UNPIVOT,Lag/Lead,分组,MAX等等中想到的组合,并且可以无处可寻。
在这一点上,我甚至可能错过了一些简单的东西,在答案上会觉得很愚蠢,但我很好,并且确实卡住了。我是否正确地尝试将这些列从他们当前所在的行中移出?有没有办法按照给定的日期使用表格?如果有什么不清楚的地方,我会尝试澄清更新或答案。干杯!
下面是我从@Fercstar选择的答案:
WITH A
AS
(
SELECT
*
,ROW_NUMBER() OVER(PARTITION BY JobNo ORDER BY Entered DESC) as StatusOrder
FROM MyJobStatusTable
)
SELECT
A.JobNo
,A.Status as Status1
,A.Entered as Entered1
,A2.Status as Status2
,A2.Entered as Entered2
,A3.Status as Status3
,A3.Entered as Entered3
,A4.Status as Status4
,A4.Entered as Entered4
,A5.Status as Status5
,A5.Entered as Entered5
,A6.Status as Status6
,A6.Entered as Entered6
,A7.Status as Status7
,A7.Entered as Entered7
,A8.Status as Status8
,A8.Entered as Entered8
,A9.Status as Status9
,A9.Entered as Entered9
FROM A
LEFT JOIN A as A2
ON A2.JobNo = A.JobNo
AND A2.StatusOrder = 2
LEFT JOIN A as A3
ON A3.JobNo = A.JobNo
AND A3.StatusOrder = 3
LEFT JOIN A as A4
ON A4.JobNo = A.JobNo
AND A4.StatusOrder = 4
LEFT JOIN A as A5
ON A5.JobNo = A.JobNo
AND A5.StatusOrder = 5
LEFT JOIN A as A6
ON A6.JobNo = A.JobNo
AND A6.StatusOrder = 6
LEFT JOIN A as A7
ON A7.JobNo = A.JobNo
AND A7.StatusOrder = 7
LEFT JOIN A as A8
ON A8.JobNo = A.JobNo
AND A8.StatusOrder = 8
LEFT JOIN A as A9
ON A9.JobNo = A.JobNo
AND A9.StatusOrder = 9
WHERE A.StatusOrder = 1
奔跑在12秒内对没有需要临时表管理超过一百万行数据。优雅!谢谢@Fercstar。
谢谢约翰·卡佩莱蒂的格式化!更可读。 – DataVis4Fun