2017-09-06 9 views
3

전년도 데이터를 사용하여 계산 된 롤링 합계를 추적하려고합니다.롤오버 합계를 통한 SQL Over 문 사용

현재 내가 내 SQL로 이것을 가지고이 같은 결과를 다시 제공

SELECT lngTIMEID as Id, 
     lngEMPID as EmployeeId, 
     dtmdateapp AS [Date], 
     stroccur AS [Value], 
     (SELECT Sum(stroccur) 
     FROM [Attendance].[dbo].timeuse a 
     WHERE a.dtmdateapp between DateAdd(d, -366, d.dtmdateapp) 
       AND d.dtmDATEAPP 
       AND a.lngempid = d.lngempid) AS Total 
FROM [Attendance].[dbo].[timeuse] d 
     WHERE lngEMPID = 1844140 AND absence = 'Unscheduled' AND lngRID IN (1,2,3,4,5,7,8,9,10,11,12,13,14) 

:

+--------+------------+-----------+-------+-------+ 
| Id | EmployeeId | Date | Value | Total | 
+--------+------------+-----------+-------+-------+ 
| 330435 | 1844140 | 4/17/2017 | 0.25 | 0.25 | 
| 330849 | 1844140 | 4/19/2017 | 0.25 | 0.5 | 
| 331108 | 1844140 | 4/20/2017 | 0.25 | 0.75 | 
| 331641 | 1844140 | 4/24/2017 | 0.25 |  1 | 
| 331736 | 1844140 | 4/25/2017 | 0.25 | 1.25 | 
| 333761 | 1844140 | 5/5/2017 | 0.25 | 1.5 | 
| 336080 | 1844140 | 5/17/2017 |  1 | 2.5 | 
| 349752 | 1844140 | 8/2/2017 | 0.25 |  3 | <--- this should be 2.75 
| 350994 | 1844140 | 8/9/2017 |  1 |  4 | 
| 351426 | 1844140 | 8/11/2017 | 0.25 | 4.25 | 
| 352132 | 1844140 | 8/15/2017 | 0.5 | 4.75 | 
| 354236 | 1844140 | 8/25/2017 | 0.25 |  5 | 
| 355580 | 1844140 | 8/29/2017 | 0.25 | 5.25 | 
| 355650 | 1844140 | 9/5/2017 | 0.25 | 5.5 | 
+--------+------------+-----------+-------+-------+ 

아이디어는이 사건의 모든을 통해 루프 및 요약 것입니다 현재 날짜의 1 년 이내에 발생하는 모든 이전 사건. 내 현재 코드와

는 계산에 문제가있을 경우 총 조회수 3

내가 제대로 계산하기 때문에 문에 걸쳐 SQL을 사용하고 싶습니다하지만 롤링와 함께 사용하는 방법을 잘 모르겠습니다 1 년 기간. 이것은 내가 사용하는 것입니다 :

SELECT lngTIMEID as Id, 
     lngEMPID as EmployeeId, 
     dtmdateapp AS [Date], 
     stroccur AS [Value], 
     sum(strOCCUR) OVER(ORDER BY dtmdateapp ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as [Total] 
FROM [Attendance].[dbo].[timeuse] d 
     WHERE lngEMPID = 1844140 AND absence = 'Unscheduled' AND lngRID IN (1,2,3,4,5,7,8,9,10,11,12,13,14) 

을이 데이터는 모두 같은 해에 발생하지만 늘 압연 1 년 기간을 위해 일 때문에 나에게 정확한 결과를 제공합니다

+--------+------------+-----------+-------+-------+ 
| Id | EmployeeId | Date | Value | Total | 
+--------+------------+-----------+-------+-------+ 
| 330435 | 1844140 | 4/17/2017 | 0.25 | 0.25 | 
| 330849 | 1844140 | 4/19/2017 | 0.25 | 0.5 | 
| 331108 | 1844140 | 4/20/2017 | 0.25 | 0.75 | 
| 331641 | 1844140 | 4/24/2017 | 0.25 |  1 | 
| 331736 | 1844140 | 4/25/2017 | 0.25 | 1.25 | 
| 333761 | 1844140 | 5/5/2017 | 0.25 | 1.5 | 
| 336080 | 1844140 | 5/17/2017 |  1 | 2.5 | 
| 349752 | 1844140 | 8/2/2017 | 0.25 | 2.75 | 
| 350994 | 1844140 | 8/9/2017 |  1 | 3.75 | 
| 351426 | 1844140 | 8/11/2017 | 0.25 |  4 | 
| 352132 | 1844140 | 8/15/2017 | 0.5 | 4.5 | 
| 354236 | 1844140 | 8/25/2017 | 0.25 | 4.75 | 
| 355580 | 1844140 | 8/29/2017 | 0.25 |  5 | 
| 355650 | 1844140 | 9/5/2017 | 0.25 | 5.25 | 
+--------+------------+-----------+-------+-------+ 

어떻게 할 수 MS SQL의 Over 문에 1 년 롤링 시간 프레임을 추가 하시겠습니까?

+1

이 문제는 dba.se에 자세히 설명했다 : [날짜 범위 롤링 합계 윈도우 함수를 사용하여 (https://dba.stackexchange.com/q/114403/57105) –

+2

나는 원래의 상관 관계를 생각한다 하위 쿼리에 기본 쿼리와 동일한 절을 추가하면 하위 쿼리가 작동합니다 (부재 = '예약되지 않은'등). –

+0

Thanks @JamesCasey, 방금 그 점을 간과했습니다. 도움을 주셔서 감사합니다 – Aaron

답변

1

James가 언급했듯이 원래의 하위 쿼리가 작동해야합니다. 나는 내 환경에서 그것을 테스트하고 올바른 결과를 반환합니다.

WITH tu AS ( 
    SELECT * 
    FROM [Attendance].[dbo].[timeuse] d 
    WHERE lngEMPID = 1844140 AND absence = 'Unscheduled' AND lngRID IN (1,2,3,4,5,7,8,9,10,11,12,13,14) 
) 
SELECT lngTIMEID as Id, 
     lngEMPID as EmployeeId, 
     dtmdateapp AS [Date], 
     stroccur AS [Value], 
     (SELECT Sum(stroccur) 
     FROM tu a 
     WHERE a.dtmdateapp between DateAdd(d, -366, d.dtmdateapp) 
       AND d.dtmDATEAPP 
       AND a.lngempid = d.lngempid) AS Total 
FROM tu d 
+0

OP는 원본 작품 여부가 아닌 'OVER' 조항을 사용하는 방법을 물었습니다. 그 이유는 명백합니다. 쿼리는 * 로트 * 클리너입니다. 사용되는 옵션에 따라 훨씬 빠릅니다. –