Author |
Topic |
sisterwolf
Starting Member
4 Posts |
Posted - 2013-01-08 : 10:33:11
|
I want to create a derived Start Date Time for Time Logs based on the Report Start Date Time and the Duration of the Ops Codes.Logic:SELECT RptID, TimeCode, HrsDur, CASE WHEN LogSeq# = 1 THEN RptStartDttm ELSE DO WHILE -- (? ? ?) -- LogSeq# = 2 THEN RptStartDttm + LogSeq#1 HrsDur LogSeq# = 3 THEN RptStartDttm + LogSeq#1 HrsDur + LogSeq#2 HrsDur LogSeq# = 4 THEN RptStartDttm + LogSeq#1 HrsDur + LogSeq#2 HrsDur + LogSeq#3 HrsDur etc. until last LogSeq# for RptID --- (OR) --- LogSeq# = 2 THEN RptStartDttm + LogSeq#1 HrsDur LogSeq# = 3 THEN LogSeq#2 OpsStartDttm + LogSeq#2 HrsDur LogSeq# = 4 THEN LogSeq#3 OpsStartDttm + LogSeq#3 HrsDur etc. until last LogSeq# for RptID END LOOP END AS OpsStartDttmFROM DailyOps, TimeLogWHERE DailyOps.RptID = TimeLog.RptID Tables:DailyOpsRptID. .RptStartDttm. . . . RptEndDttmR1. . . 01/13/2013 06:00. . 01/14/2013 06:00R2. . . 01/14/2013 06:00. . 01/15/2013 06:00TimeLogLogID. . .RptID. . .HrsDur. . .TimeCode. . .LogSeq# L1A. . . .R1. . . . .9. . . . . .MIRU. . . . . . 1 L2B. . . .R1. . . . .1. . . . . .BHA. . . . . . .2 L3C. . . .R1. . . . .4. . . . . .DR. . . . . . . 3 L4D. . . .R1. . . . .2. . . . . .SVY. . . . . . .4 L1AF. . . R2. . . . .5. . . . . .BHA. . . . . . .1 L21G. . . R2. . . . .6. . . . . .DR. . . . . . . 2 L31D. . . R2. . . . .7. . . . . .RR. . . . . . . 3 Query Result:RptID___TimeCode__HrsDur__OpsStartDttm (derived field)R1. . . . .MIRU. . . . .9. . . . . .01/13/2013 06:00R1. . . . .BHA. . . . . 1. . . . . .01/13/2013 15:00R1. . . . .DR. . . . . .4. . . . . .01/13/2013 16:00R1. . . . .SVY. . . . . 2. . . . . .01/13/2013 20:00R2. . . . .BHA. . . . . 5. . . . . .01/14/2013 06:00R2. . . . .DR. . . . . .6. . . . . .01/14/2013 11:00R2. . . . .RR. . . . . .7. . . . . .01/14/2013 17:00 |
|
sodeep
Master Smack Fu Yak Hacker
7174 Posts |
Posted - 2013-01-08 : 14:44:38
|
[code]Declare @DailyOps Table(RptId Varchar(10),RptStartDttm datetime,RptEndDttm datetime)Insert into @DailyOpsSelect 'R1','01/13/2013 06:00:00:000','01/14/2013 06:00:00:000' union allSelect 'R2','01/14/2013 06:00:00:000','01/15/2013 06:00:00:000'Declare @TimeLog Table(LogId Varchar(10),RptID Varchar(10),HrsDue int,TimeCode Varchar(10),LogSeg int)Insert into @TimeLogSelect 'L1A','R1',9,'MIRU',1 union allSelect 'L2B','R1',1,'BHA',2 union allSelect 'L3C','R1',4,'DR',3 union all Select 'L4D','R1',2,'SVY',4 union all Select 'L1AF','R2',5,'BHA',1 union all Select 'L21G','R2',6,'DR',2 union all Select 'L31D','R2',7,'RR',3Select D.RptID,T.TimeCode,T.HrsDue,T.LogSeg,ISNULL(DateAdd(hh,P.HrsDue,D.RptStartDttm),D.RptStartDttm)RptStartDttmfrom @DailyOps Dinner join @TimeLog T on T.RptID = D.RptIDOUTER APPLY ( Select K.RptID,SUM(K.HrsDue)HrsDue from @TimeLog K left join @TimeLog S on S.RptID = K.RptID and S.LogSeg = K.LogSeg + 1 Where K.RptID = T.RptID and S.LogSeg < = T.LogSeg Group by K.RptID )PRptID TimeCode HrsDue LogSeg RptStartDttmR1 MIRU 9 1 2013-01-13 06:00:00.000R1 BHA 1 2 2013-01-13 15:00:00.000R1 DR 4 3 2013-01-13 16:00:00.000R1 SVY 2 4 2013-01-13 20:00:00.000R2 BHA 5 1 2013-01-14 06:00:00.000R2 DR 6 2 2013-01-14 11:00:00.000R2 RR 7 3 2013-01-14 17:00:00.000[/code] |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2013-01-08 : 23:33:21
|
posted data indicates you're not storing date values in datetime fields. Please make sure you useappropriate datatypes for fields. Storing dates as varchar makes date manipulations like date addition complicated------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/ |
|
|
sisterwolf
Starting Member
4 Posts |
Posted - 2013-01-09 : 13:53:12
|
Thanks sodeep. Your code worked. |
|
|
sodeep
Master Smack Fu Yak Hacker
7174 Posts |
Posted - 2013-01-09 : 15:41:55
|
Welcome |
|
|
vinu.vijayan
Posting Yak Master
227 Posts |
Posted - 2013-01-11 : 07:28:48
|
You can also accomplish the requirement as follows using some running total logic : Create table DailyOps ( RptID Varchar(2), RptStartDttm DateTime, RptEndDttm DateTime ) Insert Into DailyOps Select 'R1', '2013/01/13 06:00', '2013/01/14 06:00'Union ALL Select 'R2', '2013/01/14 06:00', '2013/01/15 06:00' Create Table TimeLog ( LogID Varchar(5), RptID Varchar(2), HrsDur Int, TimeCode Varchar(5), LogSeqNo Int ) Insert Into TimeLog Select 'L1A', 'R1', 9, 'MIRU', 1 Union ALL Select 'L2B', 'R1', 1, 'BHA', 2 Union ALLSelect 'L3C', 'R1', 4, 'DR', 3 Union ALLSelect 'L4D', 'R1', 2, 'SVY', 4 Union ALLSelect 'L1AF', 'R2', 5, 'BHA', 1 Union ALLSelect 'L21G', 'R2', 6, 'DR', 2 Union ALLSelect 'L31D', 'R2', 7, 'RR', 3 ;With CTE As ( Select a.*, p.LogID, p.HrsDur, p.TimeCode, p.LogSeqNo, p.hrsdur_new, ROW_NUMBER() Over (Partition By a.RptId Order By p.LogSeqNo) As rn From DailyOps As a JOIN ( Select *, (Select SUM(HrsDur) From TimeLog Where RptID = a.RptID AND LogSeqNo <= a.LogSeqNo) As hrsdur_new From TimeLog As a ) As p ON a.RptID = p.RptID ) Select a.RptID, a.TimeCode, a.HrsDur, (Case When b.rn IS NULL Then a.RptStartDttm Else DATEADD(HH,b.hrsdur_new,b.RptStartDttm) End) As OpsStartDttm From CTE as a LEFT JOIN CTE As b ON b.rn = (a.rn - 1) And a.RptID = b.RptID I had a feeling that the Outer Apply might be working better performance wise.....but it seems that my query's performance is better compare to the one with the Outer Apply both in terms of scans and execution time. Here are the results : --Stats of my query--------------------------------(7 row(s) affected)Table 'Worktable'. Scan count 1, logical reads 27, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.Table 'DailyOps'. Scan count 2, logical reads 14, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.Table 'TimeLog'. Scan count 9, logical reads 9, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 1 ms.---------------------------------------------------------------Stats of the Outer Apply Query-----------------------------(7 row(s) affected)Table 'Worktable'. Scan count 14, logical reads 53, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.Table 'TimeLog'. Scan count 15, logical reads 15, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.Table 'DailyOps'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 4 ms. N 28° 33' 11.93148"E 77° 14' 33.66384" |
|
|
|
|
|