按类别汇总出勤时间,然后按'周'分组

时间:2013-07-25 22:18:14

标签: sql-server datetime sum

我需要按类别将出勤时间相加,然后按“周”分组。 '周'开始日期由该周的星期一定义,但星期日也有效。如果类别值在“艺术”或“PE”中,则需要将它们组合到非教育类别中。 我还需要能够标记学生达到120小时的那一天。

我的表格结构如下:

CREATE TABLE Attendance (
    ID int,
    Category varchar(20),
    Title varchar(20),
    Date datetime,  
        Hours int, 
    )

INSERT INTO Attendance  VALUES 
(4504498,   'GED Program',  '7/1/2012', 7),
(4504498,   'GED Program',  '7/2/2012', 3),
(4504498,   'GED Program',  '7/3/2012', 3),
(4504498,   'GED Program',  '7/4/2012', 7),
(4504498,   'GED Program',  '7/5/2012', 3),
(4504498,   'GED Program',  '7/8/2012', 3),
(4504498,   'GED Program',  '7/9/2012', 7),
(4504498,   'GED Program',  '7/10/2012',7),
(4504498,   'GED Program',  '7/11/2012',3),
(4504498,   'GED Program',  '7/12/2012',3),
(4504498,   'High School',  '7/1/2012', 7),
(4504498,   'High School',  '7/2/2012', 3),
(4504498,   'High School',  '7/3/2012', 3),
(4504498,   'High School',  '7/4/2012', 3),
(4504498,   'High School',  '7/5/2012', 3),
(4504498,   'High School',  '7/8/2012', 7),
(4504498,   'High School',  '7/9/2012', 3),
(4504498,   'High School',  '7/10/2012',8),
(4504498,   'High School',  '7/11/2012',3),
(4504498,   'High School',  '7/12/2012',7),
(9201052,   'Art',  '7/15/2012',    6),
(9201052,   'Art',  '7/16/2012',    3),
(9201052,   'Art',  '7/17/2012',    7),
(9201052,   'PE',   '7/17/2012',    7),
(9201052,   'PE',   '7/18/2012',    7)

我需要一个看起来像这样的最终结果:

ID  Category    Week of   Total Hours
4504498 GED Program 7/1/2012       26
4504498 GED Program 7/8/2012       23
4504498 High School     7/1/2012       19
4504498 High School     7/8/2012       28
9201052 Non Educational 7/15/2012      30

ID       Day_120_Hours_Reached
356485     6/30/2012
356485     11/15/2012
555666     10/12/2012
555666     2/25/2013

我一直在寻找一个周功能的例子,它将从使用MS Sql Server的日期中抽出“周”,我找不到太多信息。任何反馈都表示赞赏

1 个答案:

答案 0 :(得分:1)

按周计算:

select  ID
,       Category
,       min(Date) as WeekOf
,       sum(Hours) as TotalHours
from    Attendance
group by
        ID
,       Category
,       datepart(wk, Date)

要找到学生达到120小时的第一天:

select  ID
,       min(Date)
from    (
        select  ID
        ,       Date
        ,       sum(Hours) over (partition by ID order by Date) RunningSum
        from    Attendance
        ) as SubQueryAlias
where   RunningSum >= 120
group by
        ID

Live example at SQL Fiddle(总和为60而不是120,所以一名学生到达。)

如果您使用的是SQL Server 2005或更早版本,则无法使用sum() over ()。请改为join

select  ID
,       min(Date)
from    (
        select  t1.ID
        ,       t1.Date
        ,       sum(t2.Hours) as RunningSum
        from    Attendance t1
        join    Attendance t2
        on      t1.ID = t2.ID
                and t2.Date <= t1.Date
        group by
                t1.ID
        ,       t1.Date
        ) as SubQueryAlias
where   RunningSum >= 60
group by
        ID;

SQL Server 2005 example at SQL Fiddle.