2017-09-06 8 views
3

私は前年分のデータを使用して計算されたローリング・サムを追跡しようとしています。ローリング・サムでのSQLオーバー・ステートメントの使用

現在、私は私の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年以内に発生したすべての過去の出来事。それは、正しく計算が、私はローリングでそれを使用する方法がわからないですので、私は声明以上SQLを使用したい総ヒット数3

計算に問題がある私の現在のコードで

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

私はあなたの元には相関関係を考えますサブクエリをメインクエリと同じサブクエリに追加すると、サブクエリが機能するはずです(不在= 'Unscheduled'など)。 –

+0

ありがとう@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'句の使い方を尋ねました。その理由は明らかです。クエリは*ロット*クリーナーです。使用されるオプションに応じて、より高速にすることもできます –

関連する問題