Sql server SQL server总计/数据透视

Sql server SQL server总计/数据透视,sql-server,Sql Server,我有一个关于如何“pivot/total”的问题,因为缺少一个更好的词来描述SQL server中的一些数据。数据基本上是员工轮班,然后是轮班损失的小时数。例如,我在一个表中有一条记录 Staff_ID Shift_start Shift_end 37 09:00 17:30 然后我们会在另一张桌子上给那个人一顿午餐 Staff_ID Start End 37 13:00 14:00 当然

我有一个关于如何“pivot/total”的问题,因为缺少一个更好的词来描述SQL server中的一些数据。数据基本上是员工轮班,然后是轮班损失的小时数。例如,我在一个表中有一条记录

Staff_ID    Shift_start    Shift_end
37        09:00          17:30
然后我们会在另一张桌子上给那个人一顿午餐

Staff_ID        Start       End
37           13:00        14:00
当然,我们全天都有更多的代理商,上面的方案也简化了,但你明白了。然后将其转换为15分钟内的员工人数

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

目前SQLServer存储了所有这些数据,但为了“合计”代理,我必须将这些数据带到Access中,并使用数组计算出每15分钟内的员工数量,然后将这些数据保存回数据库。这是一个快速的更新过程

试试这个:

;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)
更新

试试这个:

;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)

你可以尝试几种方法。一种方法是准确地获取Access中的内容并将其转换为SQL。如果有一部分你不知道该怎么做,请在这里发布,我们可以提供帮助

另一种方法是使用游标(而不是单个集合函数)来迭代每个15分钟的时间段,加载在此期间工作的员工,或每个员工的日程安排,填充其所有15分钟的工作时间段。你可能已经在Access中这样做了,我不知道


由于它们每天都是相同的15分钟周期,您可以将时间存储在表中并对其进行外部联接,但性能可能比您的访问过程差。

您可以尝试几种方法。一种方法是准确地获取Access中的内容并将其转换为SQL。如果有一部分你不知道该怎么做,请在这里发布,我们可以提供帮助

另一种方法是使用游标(而不是单个集合函数)来迭代每个15分钟的时间段,加载在此期间工作的员工,或每个员工的日程安排,填充其所有15分钟的工作时间段。你可能已经在Access中这样做了,我不知道


由于它们每天都是相同的15分钟周期,您可以将时间存储在表中并对其进行外部联接,但性能可能比您的访问过程更差。

。指定sql的版本server@Beth,我使用的是SQL server 2008R2 Expresspls。指定sql的版本server@Beth,我使用的是SQL server 2008R2 ExpressDenis,谢谢你的代码,但这不是我想要的。从我所看到的情况来看,当我运行这个程序时,我愿意纠正,它只是告诉我有多少员工在特定的时间间隔内开始轮班。我想要的是,如果有人在09:00开始轮班,17:30结束,他们会出现在09:00、09:15、09:30、09:45……。17:00和17:15的间隔。@Kevin Ross我明白了。。。回到绘图板上。丹尼斯,谢谢你回到绘图板上,它很有魅力。我现在把其中的一些串在一起以得到完整的查询,即[轮班员工]+[加班]-[假日]-[午餐/休息等]丹尼斯,谢谢你的代码,但这不是我想要的。从我所看到的情况来看,当我运行这个程序时,我愿意纠正,它只是告诉我有多少员工在特定的时间间隔内开始轮班。我想要的是,如果有人在09:00开始轮班,17:30结束,他们会出现在09:00、09:15、09:30、09:45……。17:00和17:15的间隔。@Kevin Ross我明白了。。。回到绘图板上。丹尼斯,谢谢你回到绘图板上,它很有魅力。我现在将其中的一些串接在一起,以获得完整的查询,即[轮班员工]+[加班]-[假日]-[午餐/休息等]