繁体   English   中英

SQL Server,如何基于星期几求和

[英]SQL Server, how to sum based on day of the week

我有一张桌子可以保持出勤率。 它包含三列:

createdby (varchar(30))
TimeSheetDate (dateTime)
Workinghours (integer)

我想查找一周中某一天的总工作时间。 例如

Monday   Tuesday    Wednesday
------------------------------
10        9         11

我很难获得基于DOW的总数。

这是我的查询:

SELECT 
    createdby,
    CASE 
        WHEN dbo.udf_DayOfWeek(TimeSheetDate) = 'Monday'  
           THEN sum(WorkingHours) as Monday 
        WHEN dbo.udf_DayOfWeek(TimeSheetDate) = 'Tuesday' 
           THEN sum(WorkingHours) as Tuesday
        WHEN dbo.udf_DayOfWeek(TimeSheetDate) = 'Wednesday' 
           THEN sum(WorkingHours) as Wednesday
        WHEN dbo.udf_DayOfWeek(TimeSheetDate) = 'Thursday' 
           THEN sum(WorkingHours) as Thursday
    End 
FROM 
    TS.TimesheetsDetails
WHERE 
    CreatedDate <= '2014-09-26' AND 
    CreatedDate >= '2014-09-19' 
GROUP BY 
    createdby, dbo.udf_DayOfWeek(TimeSheetDate)

但它不起作用,并给出错误。

任何人都可以提供适当的指导吗? 顺便说一句,函数udf_DayOfWeek()返回星期几。

这看起来像是有条件的总和。 关键是不能是条件 ,只能是聚合内的 因此,您必须将case语句放入SUM()

select createdby,
    sum(case when dbo.udf_DayOfWeek(TimeSheetDate)='Monday' then WorkingHours else 0 end) as Monday,
    sum(case when dbo.udf_DayOfWeek(TimeSheetDate)='Tuesday' then WorkingHours else 0 end) as Tuesday,
    ...
from TS.TimesheetsDetails
where CreatedDate between '2014-09-19' and '2014-09-26'
group by createdby

注意1:如果您也想按星期汇总,我不明白为什么要按星期几分组。 我已经删除了。

注意2:我不确定为什么要使用UDF而不是内置的DATEPART函数来获取星期几。


另外,您可以透视一下,看起来更干净一些:

select createdby, Monday, Tuesday, ...
from (
    select createdby, dbo.udf_DayOfWeek(TimeSheetDate) as dow, WorkingHours
    from TS.TimesheetsDetails
    where CreatedDate between '2014-09-19' and '2014-09-26'
) x
pivot (
    sum(WorkingHours)
    for dow in ([Monday],[Tuesday],...)
) p

尝试这个

但是我不确定

     SELECT createdby, CASE WHEN dbo.udf_DayOfWeek(TimeSheetDate)='Monday' THEN sum(WorkingHours) end as Monday,case WHEN dbo.udf_DayOfWeek(TimeSheetDate)='Tuesday' THEN sum(WorkingHours) end as Tuesday,case WHEN dbo.udf_DayOfWeek(TimeSheetDate)='Wednesday' THEN sum(WorkingHours) end as Wednesday,case  WHEN dbo.udf_DayOfWeek(TimeSheetDate)='Thursday' THEN sum(WorkingHours) end as Thursday

 FROM TS.TimesheetsDetails WHERE CreatedDate <='2014-09-26' and CreatedDate>='2014-09-19' GROUP BY createdby, dbo.udf_DayOfWeek(TimeSheetDate)`

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM