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