2016-09-30 1 views
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 's 항목을 가져와야하지만, 이번 주에 20 명이 아니라 1525 명이되어야합니다.

+0

'WHERE' 절을 꺼내는 것만 큼 간단합니까? –

+0

테이블 구조 및 일부 삽입 데이터. 그것은 당신의 쿼리를 디버깅하는 데 도움이됩니다. – khalid

+0

어디에서해야 할 것인가는 지난 주 근무한 사람이 될 수 있기 때문입니다. –

답변

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 

시도 할 수 없어 작동하지 않을 수도 있습니다. 오류가 발생하면 의견을 추가하십시오.

편집 : 잘못 입력이 같은

0

는 조건 (A 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 
+0

감사합니다. SlimsGhost. 그것도 잘 작동합니다! –