Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- +------------------------------------------++-------------------------------------------------------+
- | DAILY || MONTHLY |
- +-------------+-------+-------+----------+-------+-------++-------+------------+-------+----------+-------+-------+
- | Creator | Count | Time | Average | Min. | Max. || Count | Daily Avg. | Time | Average | Min. | Max. |
- +-------------+-------+-------+----------+-------+-------++-------+------------+-------+----------+-------+-------+
- | williamsonb | 42 | 3:56 | 00:08:34 | 00:02 | 00:34 || ... | ... | ... | ... | ... | ... |
- | petersonl | ... | ... | ... | ... | ... || ... | ... | ... | ... | ... | ... |
- | ... | ... | ... | ... | ... | ... || ... | ... | ... | ... | ... | ... |
- +-------------+-------+-------+----------+-------+-------++-------+------------+-------+----------+-------+-------+
- CREATE TABLE WorkOrders(CreatedBy CHAR(25), CreatedTime DATETIME)
- INSERT INTO WorkOrders values
- ('williamsonb', '2017/03/26 12:05:00.000 PM'),
- ('williamsonb', '2017/03/26 12:12:00.000 PM'),
- ('williamsonb', '2017/03/26 01:31:00.000 PM'),
- ('williamsonb', '2017/03/02 09:45:00.000 AM'),
- ('williamsonb', '2017/03/02 09:49:00.000 AM'),
- ('williamsonb', '2017/03/02 09:51:00.000 AM'),
- ('williamsonb', '2017/02/04 02:14:00.000 PM'),
- ('petersonl', '2017/03/26 07:42:00.000 AM'),
- ('petersonl', '2017/03/26 07:45:00.000 AM'),
- ('petersonl', '2017/03/26 07:46:00.000 AM'),
- ('petersonl', '2017/03/05 08:47:00.000 AM'),
- ('petersonl', '2017/03/05 08:49:00.000 AM'),
- ('petersonl', '2017/03/05 08:50:00.000 AM'),
- ('petersonl', '2017/01/17 06:54:00.000 AM');
- DECLARE
- @DayCount INT = COUNT(SELECT CreatedBy
- FROM WorkOrders
- WHERE CreatedTime = DATEADD(DAY, -1, GETDATE()),
- @DayTimeSum DECIMAL = SUM(DATEDIFF(HOUR, SELECT (HOUR(CreatedTime)
- FROM WorkOrders
- WHERE DATEADD(DAY,-1,GETDATE()))
- + DATEDIFF(MINUTE, SELECT (MINUTE(CreationDate)/60
- FROM WorkOrders
- WHERE DATEADD(DAY,-1,GETDATE()))
- + DATEDIFF(SECOND, SELECT (SECOND(CreationDate)/3600
- FROM WorkOrders
- WHERE DATEADD(DAY,-1,GETDATE()))),
- @DaySumHours INT = @DayTimeSum - MOD(@DayTimeSum % 1),
- @DaySumMinutes INT = (MOD(@DayTimeSum % 1) - MOD(MOD(@DayTimeSum % 1) % 1/60) ) * 60,
- @DayAvgTime DECIMAL = @DayCount / @DayTimeSum,
- @DayAvgHours INT = @DayAvgTime - MOD(@DayAvgTime % 1),
- @DayAvgMinutes INT = (MOD(@DayAvgTime % 1) - MOD(MOD(@DayAvgTime % 1) % 1/60)) * 60,
- @DayAvgSeconds INT = ((MOD(@DayAvgTime % 1)
- - MOD(MOD(@DayAvgTime % 1) % 1/60))
- - MOD((MOD(@DayAvgTime % 1)
- - MOD(MOD(@DayAvgTime % 1) % 1/60) ) % 1/3600) ) * 3600,
- @MonthTimeSum DECIMAL = SUM(DATEDIFF(HOUR, SELECT (HOUR(CreatedTime)
- FROM WorkOrders
- WHERE DATEADD(MONTH,-1,GETDATE()))
- + DATEDIFF(MINUTE, SELECT (MINUTE(CreationDate)/60
- FROM WorkOrders
- WHERE DATEADD(MONTH,-1,GETDATE()))
- + DATEDIFF(SECOND, SELECT (SECOND(CreationDate)/3600
- FROM WorkOrders
- WHERE DATEADD(MONTH,-1,GETDATE())));
- SELECT DISTINCT CreatedBy
- ,@DayCount AS [Count]
- ,@DaySumHours + ':' + @DaySumMinutes + ':' + @DaySumSeconds AS [Total]
- ,@DayAvgHours + ':' + @DayAvgMinutes + ':' + @DayAvgSeconds AS [Average]
- ,LAST(SELECT CAST(SELECT CAST(CreatedTime AS TIME) AS CHAR(5))) AS [Min.]
- ,TOP 1(CAST(SELECT CAST(CreatedTime AS TIME) AS CHAR(5))) AS [Max.]
- FROM WorkOrders
- WHERE CreatedTime BETWEEN DATEADD(MONTH,-1,GETDATE()) AND GETDATE()
- GROUP BY CreatedBy
- ORDER BY CreatedTime DESC;
- -- Test Data
- CREATE TABLE #WorkOrders(CreatedBy CHAR(25), CreatedTime DATETIME)
- INSERT INTO #WorkOrders values
- ('williamsonb', '2017/03/27 12:05:00.000 PM'),
- ('williamsonb', '2017/03/27 12:12:00.000 PM'),
- ('williamsonb', '2017/03/27 01:31:00.000 PM'),
- ('williamsonb', '2017/03/26 09:04:00.000 PM'),
- ('williamsonb', '2017/03/26 09:12:00.000 PM'),
- ('williamsonb', '2017/03/26 10:32:00.000 PM'),
- ('williamsonb', '2017/03/02 09:45:00.000 AM'),
- ('williamsonb', '2017/03/02 09:49:00.000 AM'),
- ('williamsonb', '2017/03/02 09:51:00.000 AM'),
- ('williamsonb', '2017/02/04 02:14:00.000 PM'),
- ('petersonl', '2017/03/27 07:42:00.000 AM'),
- ('petersonl', '2017/03/27 07:45:00.000 AM'),
- ('petersonl', '2017/03/27 07:46:00.000 AM'),
- ('petersonl', '2017/03/26 08:41:00.000 AM'),
- ('petersonl', '2017/03/26 08:46:00.000 AM'),
- ('petersonl', '2017/03/26 08:48:00.000 AM'),
- ('petersonl', '2017/03/05 08:47:00.000 AM'),
- ('petersonl', '2017/03/05 08:49:00.000 AM'),
- ('petersonl', '2017/03/05 08:50:00.000 AM'),
- ('petersonl', '2017/01/17 06:54:00.000 AM');
- WITH BaseData AS
- (SELECT CreatedBy
- ,CreatedTime
- ,LEAD(CreatedTime,1) OVER (PARTITION BY CreatedBy, DATEDIFF(DAY, 0, CreatedTime) ORDER BY CreatedTime) as EndTime
- FROM #WorkOrders
- )
- --SELECT * FROM BaseData
- ,DataWDuration AS
- (SELECT CreatedBy
- ,CreatedTime
- ,EndTime
- ,CASE WHEN DATEDIFF(SECOND, CreatedTime, EndTime) < 60 THEN 60 ELSE DATEDIFF(SECOND, CreatedTime, EndTime) END as Duration
- FROM BaseData
- )
- ,DayTotal AS
- (SELECT CreatedBy
- ,COUNT(*) as dailyCount
- ,SUM(Duration) as dailyTimeSec
- ,AVG(Duration) as DailyAvgTimeSec
- ,MIN(Duration) as DailyMinTimeSec
- ,MAX(Duration) as DailyMaxTimeSec
- FROM DataWDuration
- WHERE DATEDIFF(DAY, 0, CreatedTime) = DATEDIFF(DAY, 1, GETDATE()) -- compares date part of CreatedTime with yesterday's date
- GROUP BY CreatedBy
- )
- ,MTDTotal AS
- (SELECT CreatedBy
- ,COUNT(*) as mtdCount
- ,COUNT(DISTINCT DATEDIFF(DAY, 0, CreatedTime)) as ActiveDays
- ,COUNT(*) * 1.0 / DATEPART(DAY, GETDATE()) as mtdAvgDailyCount
- ,COUNT(*) * 1.0 / COUNT(DISTINCT DATEDIFF(DAY, 0, CreatedTime)) as mtdActiveDayAvgCount
- ,SUM(Duration) as mtdTimeSec
- ,AVG(Duration) as mtdAvgTimeSec
- ,MIN(Duration) as mtdMinTimeSec
- ,MAX(Duration) as mtdMaxTimeSec
- FROM DataWDuration
- WHERE CreatedTime >= DATEADD(DAY, 1 - DATEPART(DAY, DATEADD(DAY, -1, GETDATE())), CAST(DATEDIFF(DAY, 1, GETDATE()) as datetime)) -- picks up all activity for current calendar month to date
- AND CreatedTime < DATEDIFF(DAY, 0, GETDATE()) -- ignore anything entered today.
- GROUP BY CreatedBy
- )
- SELECT *
- FROM DayTotal dt
- FULL JOIN MTDTotal mt ON (dt.CreatedBy = mt.CreatedBy)
- ;
- CreatedBy dailyCount dailyTimeSec DailyAvgTimeSec DailyMinTimeSec DailyMaxTimeSec mtdCount ActiveDays mtdAvgDailyCount mtdActiveDayAvgCount mtdTimeSec mtdAvgTimeSec mtdMinTimeSec mtdMaxTimeSec
- --------------- ----------- ------------ --------------- --------------- --------------- ----------- ----------- --------------------- ---------------------- ----------- ------------- ------------- -------------
- petersonl 3 240 120 60 180 9 3 0.321428571428 3.000000000000 840 140 60 300
- williamsonb 3 5160 2580 420 4740 9 3 0.321428571428 3.000000000000 10800 1800 120 4800
- select cast(CreatedTime as Date) as CreatedDate, CreatedBy
- , CONVERT(VARCHAR(8), min(CreatedTime), 108) as [start]
- , CONVERT(VARCHAR(8), max(CreatedTime), 108) as [stop]
- , datediff(MINUTE, min(CreatedTime), MAX(CreatedTime)) as [start-stop]
- , count(*) as count
- , cast(datediff(MINUTE, min(CreatedTime), MAX(CreatedTime)) / cast((count(*) - 1) as decimal) as decimal(6,2)) as [avg]
- from WorkOrders
- group by cast(CreatedTime as Date), CreatedBy
- having count(*) > 1
- union
- select cast(CreatedTime as Date) as CreatedDate, CreatedBy
- , CONVERT(VARCHAR(8), max(CreatedTime), 108)
- , null
- , null
- , count(*) as count
- , null
- from WorkOrders
- group by cast(CreatedTime as Date), CreatedBy
- having count(*) = 1
- order by cast(CreatedTime as Date) desc, CreatedBy
- select [CreatedDate], CreatedBy
- , CONVERT(VARCHAR(8), CreatedTime, 108) as [time]
- , CONVERT(VARCHAR(8), [min], 108) as [min]
- , CONVERT(VARCHAR(8), [max], 108) as [max]
- , datediff(MINUTE, [min], [max]) as [min-max]
- , CONVERT(VARCHAR(8), [next], 108) as [next]
- , datediff(MINUTE, [next], [CreatedTime]) as [time-next]
- , [count]
- , [first], [last]
- from
- ( select CreatedBy, cast(CreatedTime as date) as [CreatedDate], CreatedTime
- , LEAD(CreatedTime) OVER (PARTITION BY CreatedBy, cast(CreatedTime as date) ORDER BY CreatedTime desc) AS [next]
- , min(CreatedTime) OVER (PARTITION BY CreatedBy, cast(CreatedTime as date) ORDER BY CreatedTime) AS [min]
- , max(CreatedTime) OVER (PARTITION BY CreatedBy, cast(CreatedTime as date) ORDER BY CreatedTime) AS [max]
- , COUNT(*) OVER (PARTITION BY CreatedBy, cast(CreatedTime as date)) AS [count]
- , ROW_NUMBER() OVER (PARTITION BY CreatedBy, cast(CreatedTime as date) ORDER BY CreatedTime) AS [last]
- , ROW_NUMBER() OVER (PARTITION BY CreatedBy, cast(CreatedTime as date) ORDER BY CreatedTime desc) AS [first]
- from WorkOrders
- ) tt
- -- where tt.first = 1 or tt.last = 1
- order by tt.CreatedDate desc, CreatedBy
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement