开发者

SQL server total/pivot

I have a question about how to “pivot/total” (for want of a better word) some data around in SQL server. The data is basically staff shifts and then hours lost from those shifts. So for example I have a record in one table

Staff_ID    Shift_start    Shift_end
37        09:00          17:30

And then we would give that person a lunch in another table

Staff_ID        Start       End
37           13:00        14:00

Of course we have more agents throughout the day and the scheme above is simplified but you get the idea. This is then transformed into the number of staff in 15 minutes

Interval    Staff
09:00       5
09:15       7
09:30       6

And so on.

At the moment SQL server stores all of this but to “total” the agents up I have to bring things into Access and using arrays work开发者_JAVA百科 out the number of staff in each 15 minute period and then save this data back to the database. It’s a quick process (<1500ms) but what I’m looking for is a way to do this in SQL server itself and not have to bring things to Access and write it back.

Am I barking up the wrong tree with this one?

EDIT:

I'm using SQL server 2008R2 Express


Update

Try this:

;with Intervals(start) as --00:00 - 23:45
(
select dateadd(minute, 0,0)
union all
select dateadd(minute, 15, start) from Intervals
where datediff(hour, 0, dateadd(minute, 15, start))<24
)
select convert(varchar, i.start, 108) [Interval], count(*) [Staff]
from Intervals i
join 
(
    select cast('09:31:29' as datetime) [start], cast('17:11:29' as datetime) [end] union all
    select cast('10:43:12' as datetime), cast('18:21:29' as datetime)  union all
    select cast('11:59:53' as datetime), cast('19:51:29' as datetime)  
)s
on cast(convert(varchar(10), s.start, 108)as datetime) <= i.start
and dateadd(minute, 15, i.start)  <= cast(convert(varchar(10), s.[end], 108) as datetime) 
group by convert(varchar, i.start, 108)


You have a few approaches you could try. One would be to take exactly what you have in Access and convert it to SQL. If there's part of that you're not sure how to do, post it here and we can help.

Another would be to use a cursor (as opposed to a single set function) to iterate through either each 15 minute time period, loading staff working during that period, or each staff person's schedule, populating all of their working 15-minute time periods. You may be doing this in Access already, I can't tell.

Since they're the same 15-minute periods each day, you can store the times in a table and do an outer join on them, but the performance could be worse than your Access process.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜