代码之家  ›  专栏  ›  技术社区  ›  Kevin Ross

SQL server总计/数据透视

  •  1
  • Kevin Ross  · 技术社区  · 15 年前

    我有一个问题,关于如何在SQLServer中透视/汇总一些数据。数据基本上是员工轮班,然后从这些轮班中损失的小时数。例如,我在一个表中有一个记录

    Staff_ID    Shift_start    Shift_end
    37        09:00          17:30
    

    然后我们会在另一张桌子上给那个人一顿午餐

    Staff_ID        Start       End
    37           13:00        14:00
    

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

    等等。

    我用这棵树是不是找错树了?

    我正在使用SQL server 2008R2 Express

    2 回复  |  直到 15 年前
        1
  •  1
  •   Denis Valeev    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)
    
        2
  •  0
  •   Beth    15 年前

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

    另一种方法是使用游标(与单个set函数相反)遍历每个15分钟的时间段,加载在该时间段内工作的员工,或者遍历每个员工的日程表,填充他们所有的15分钟工作时间段。你可能已经在Access里做了,我不知道。

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