1

有一个员工表,其中每人每天重新排序一个条目。

我创建了这个查询并且它有效,但它应该是员工自开始以来的总小时数,而不是上周工作的总小时数。

有人能帮忙吗?我搞不清楚了。谢谢你。

SELECT SSN, firstname, Lastname, SUM(CAST(Hours as float)) AS HourstoDate 
FROM Employees
WHERE CAST(Scheduled as datetime) >= DateAdd( d, DateDiff( d, 0, GetDate()-5 ), 0 )
GROUP BY SSN, Lastname, FirstName

SSN     FirstName   LastName    Scheduled       Hours
1234    Jane        Doe         Monday 9/26     10
1234    Jane        Doe         Tuesday 9/27    10

自从 Jane 本周工作以来,它应该会取消 Jane 的条目,但小时数必须是 1525,而不是她这周工作的 20。

4

2 回答 2

0

您可以更改您的过滤器,使其先将所有小时数相加,然后确保满足“本周工作”条件(使用having子句),如下所示:

SELECT SSN, firstname, Lastname, SUM(CAST(Hours as float)) AS HourstoDate, max(case when CAST(Scheduled as datetime) >= DateAdd( d, DateDiff( d, 0, GetDate()-5 ), 0 ) then 1 else 0 end) as worked_this_week
FROM Employees
GROUP BY SSN, Lastname, FirstName
HAVING max(case when CAST(Scheduled as datetime) >= DateAdd( d, DateDiff( d, 0, GetDate()-5 ), 0 ) then 1 else 0 end) = 1
于 2016-09-30T20:54:41.470 回答
0

该查询不起作用,因为您将两个搜索合二为一,在同一个表上。您不能搜索某个日期之后的记录,并同时检索从时间开始的所有记录。

在这些情况下,我的方法是将表格与自身连接起来。理想情况下,它应该是这样的:

select
  z.ssn
, z.firstname
, z.lastname
, sum ( cast ( eo.hours as float ) ) as hourstodate
from (
    select distinct
      ei.ssn
    , ei.firstname
    , ei.lastname
    from
      employees ei
    where
          cast ( ei.scheduled as datetime ) > dateadd ( ei.d , datediff ( ei.d , 0 , getdate() - 5 ) , 0 )
) z
join employees eo on ( z.ssn = eo.ssn and z.firstname = eo.firstname and z.lastname = eo.lastname )
group by
  z.ssn
, z.lastname
, z.firstdate

我不能尝试,所以我不能保证它会起作用。如果返回错误,请随意添加评论。

编辑:错误输入

于 2016-09-30T20:47:02.547 回答