2017-08-21 17 views
1

ID、日付、および値を含むデータポイントを調べるクエリを作成しようとしています。これらのデータポイントは従業員の休暇を表します。ここで前年度データの累積合計を保持する - SQL Server

は、いくつかのサンプルデータポイント(オフ時間の要求)の例である:

+------------+-------+-------+-------------+ 
| Date | Value | Total | Status | 
+------------+-------+-------+-------------+ 
| 8/20/2015 | 0.25 | 0.25 |    | 
| 1/11/2016 |  1 | 1.25 |    | 
| 5/27/2016 | 0.5 | 1.75 |    | 
| 8/5/2016 | 0.25 |  2 |    | 
| 9/13/2016 |  0 | 1.75 |    | 
| 9/28/2016 | 0.25 |  2 |    | 
| 9/29/2016 | 0.25 | 2.25 |    | 
| 10/17/2016 |  0 | 2.25 |    | 
| 10/17/2016 |  1 | 3.25 | Verbal  | 
| 11/17/2016 | 0.25 | 3.5 |    | 
| 12/1/2016 |  1 | 4.5 | Written  | 
| 12/2/2016 |  1 | 5.5 | Final  | 
| 12/6/2016 | 0.25 | 5.75 |    | 
| 12/14/2016 | 0.25 |  6 | Termination | 
| 12/19/2016 | 0.25 | 6.25 |    | 
| 1/6/2017 | 0.25 | 6.5 |    | 
| 2/15/2017 | 0.25 | 5.75 | Final  | 
| 3/15/2017 | 0.25 |  6 | Termination | 
| 4/17/2017 | 0.25 | 6.25 |    | 
| 5/8/2017 |  0 | 6.25 |    | 
| 5/9/2017 |  1 | 7.25 |    | 
| 5/21/2017 | 0.25 | 7.5 |    | 
|   |  |  |    | 
+------------+-------+-------+-------------+ 

私は上記の結果を計算し、クエリを持っていると思います。合計列は、現在のデータポイント日付の1年以内の前のデータポイントの合計によって計算されます。したがって、現在のデータポイントの日付が9/29/2016の場合は、2015年9月29日〜2015年9月29日までのすべての以前のデータポイントを追加したいと考えています。

私の最終目標は、人が自分の休暇(データポイント)に基づいて昨年2回の最終的な警告を受けているかどうかを確認することです。私が提供した私の例に基づいて、2011年12月12日と2015年2月15日に発行された最終的な警告があり、それらは昨年(2011年8月21日〜2011年8月21日)に発生しました。

これを行う最善の方法は何ですか?ここで

は、私が現在持っているものです。

SELECT 
    a.dtmDATEAPP AS [Date], 
    MAX(CASE WHEN a.dtmDATEAPP = b.dtmDATEAPP THEN a.strOCCUR END) AS [Value], 
    SUM(b.strOCCUR) AS Total, 
    CASE 
     WHEN SUM(b.strOCCUR) >= 5 AND SUM(b.strOCCUR) < 6 
      THEN 'Final' 
    END AS [Status] 
FROM 
    [Attendance].[dbo].[TIMEUSE] a 
JOIN 
    [Attendance].[dbo].[TIMEUSE] b ON b.dtmDATEAPP BETWEEN DATEADD(year, -1, a.dtmDATEAPP) AND a.dtmDATEAPP 
WHERE 
    a.lngEMPID = 1162002 
    AND a.Absence <> 'Scheduled' 
    AND b.lngEMPID = 1162002 
    AND b.Absence <> 'Scheduled' 
GROUP BY 
    a.dtmDATEAPP 
ORDER BY 
    a.dtmDATEAPP 

私は従業員が昨年中に2回の最終警告を持っている場合の最適なルートを見て確認していません。

すべてのお手伝いが大変ありがとうございます。このような

答えて

0

何かがあなたを助けるかもしれない:最終ステータスがprevyrtotによって決定される

declare @TimeUsage table 
(
missingDate date, 
absence varchar(20), 
pctDay decimal(6,2), 
status varchar(20), 
employeeid int 
) 
INSERT INTO @TimeUsage VALUES 
('8/20/2015', 'Unscheduled', 0.25, '', 1162002),    
('1/11/2016', 'Unscheduled', 1, '', 1162002),    
('5/27/2016', 'Unscheduled', 0.5, '', 1162002),    
('8/5/2016', 'Unscheduled', 0.25, '', 1162002),    
('9/13/2016', 'Unscheduled', 0, '', 1162002),    
('9/28/2016', 'Unscheduled', 0.25, '', 1162002),    
('9/29/2016', 'Unscheduled', 0.25, '', 1162002),    
('10/17/2016', 'Unscheduled', 0, '', 1162002),    
('10/17/2016', 'Unscheduled', 1, 'Verbal', 1162002),   
('11/17/2016', 'Unscheduled', 0.25, '', 1162002),    
('12/1/2016', 'Unscheduled', 1, 'Written', 1162002),  
('12/2/2016', 'Unscheduled', 1, 'Final', 1162002),   
('12/6/2016', 'Unscheduled', 0.25, '', 1162002),    
('12/14/2016', 'Unscheduled', 0.25, 'Termination', 1162002), 
('12/19/2016', 'Unscheduled', 0.25, '', 1162002),    
('1/6/2017', 'Unscheduled', 0.25, '', 1162002),    
('2/15/2017', 'Unscheduled', 0.25, 'Final', 1162002),   
('3/15/2017', 'Unscheduled', 0.25, 'Termination', 1162002), 
('4/17/2017', 'Unscheduled', 0.25, '', 1162002),    
('5/8/2017', 'Unscheduled', 0, '', 1162002),    
('5/9/2017', 'Unscheduled', 1, '', 1162002),    
('5/21/2017', 'Unscheduled', 0.25, '', 1162002) 

;WITH cte AS 
(SELECT missingDate, pctDay, 
(SELECT SUM(pctDay) FROM @TimeUsage 
WHERE missingDate <= d.missingDate 
AND missingDate >= DATEADD(yy,-1,d.missingDate) 
AND employeeid = d.employeeid 
AND absence <> 'Scheduled') as prevYrTot, 
(SELECT COUNT(*) FROM @TimeUsage 
WHERE missingDate <= d.missingDate 
AND missingDate >= DATEADD(yy,-1,d.missingDate) 
AND employeeid = d.employeeid 
AND status = 'Final') AS FinalCount, 
status,employeeid 
from @TimeUsage d) 
SELECT * FROM cte where employeeid IN 
(SELECT DISTINCT(employeeid) FROM cte WHERE FinalCount > 1) 

EDIT

場合、これを試してみてください。

declare @TimeUsage table 
(
missingDate date, 
absence varchar(20), 
pctDay decimal(6,2), 
employeeid int 
) 
INSERT INTO @TimeUsage VALUES 
('8/20/2015', 'Unscheduled', 0.25, 1162002),    
('1/11/2016', 'Unscheduled', 1, 1162002),    
('5/27/2016', 'Unscheduled', 0.5, 1162002),    
('8/5/2016', 'Unscheduled', 0.25, 1162002),    
('9/13/2016', 'Unscheduled', 0, 1162002),    
('9/28/2016', 'Unscheduled', 0.25, 1162002),    
('9/29/2016', 'Unscheduled', 0.25, 1162002),    
('10/17/2016', 'Unscheduled', 0, 1162002),    
('10/17/2016', 'Unscheduled', 1, 1162002),   
('11/17/2016', 'Unscheduled', 0.25, 1162002),    
('12/1/2016', 'Unscheduled', 1, 1162002),  
('12/2/2016', 'Unscheduled', 1, 1162002),   
('12/6/2016', 'Unscheduled', 0.25, 1162002),    
('12/14/2016', 'Unscheduled', 0.25, 1162002), 
('12/19/2016', 'Unscheduled', 0.25, 1162002),    
('1/6/2017', 'Unscheduled', 0.25, 1162002),    
('2/15/2017', 'Unscheduled', 0.25, 1162002),   
('3/15/2017', 'Unscheduled', 0.25, 1162002), 
('4/17/2017', 'Unscheduled', 0.25, 1162002),    
('5/8/2017', 'Unscheduled', 0, 1162002),    
('5/9/2017', 'Unscheduled', 1, 1162002),    
('5/21/2017', 'Unscheduled', 0.25, 1162002) 

;WITH cte as 
(SELECT missingDate, pctDay, prevYrTot, employeeid, 
CASE WHEN prevYrTot >= 5 AND prevYrTot < 6 
THEN 'Final' ELSE '' END AS Status FROM 
(SELECT missingDate, pctDay, 
(SELECT SUM(pctDay) FROM @TimeUsage 
WHERE missingDate <= d.missingDate 
AND missingDate >= DATEADD(yy,-1,d.missingDate) 
AND employeeid = d.employeeid 
AND absence <> 'Scheduled') as prevYrTot, 
employeeid 
from @TimeUsage d) tu) 
SELECT missingDate, pctDay, prevYrTot, employeeid, Status FROM cte 
WHERE employeeid IN 
(SELECT DISTINCT employeeid FROM (SELECT employeeid, COUNT(*) as FinalCount FROM cte 
WHERE Status = 'Final' 
GROUP BY employeeid 
HAVING Count(*) > 1) de) 

私は、それはあなたが何をしたいんだと思うけどあなたはテストする必要があります!それは与えられたデータのために働く。

+0

これは、私のテーブルにステータスの列がないことを除いて、私が探しているものに本当に近いです。私は最終的に> 5と> 6の合計があると判断できます。これをクエリにどのように追加できますか? – Aaron

+0

ステータスが別のテーブルから来た場合は、SELECT COUNT(*)サブクエリを変更する必要があります。合計についての基準を追加するには、最後にANDを追加し、employeeid IN(SELECT DISTINCT(employeeid)FROM cte WHERE prevYrTot> = 5) –

+0

@Aaron自分の編集を試してください。 –