2010-04-30 31 views
2

我需要一些T-SQL來顯示缺少的記錄。Select Statement顯示缺少的記錄(簡單問題)

下面是一些樣本數據:

Emp 1 
01/01/2010 
02/01/2010 
04/01/2010 
06/01/2010 

Emp 2 
02/01/2010 
04/01/2010 
05/01/2010 
etc... 

我需要知道

Emp 1 is missing 
03/01/2010 
05/01/2010 

Emp 2 is missing 
01/01/2010 
03/01/2010 
06/01/2010 

檢查將開始與今天的日期,並回到6個月的範圍。

在這個例子中,可以說,今天的日期是06/12/2010這樣的範圍將是01/01/2010 06/01/2010直通。

這一天始終是數據中的第一位。

非常感謝。 :)

格哈德·魏斯
祕書Great Lakes Area .NET Users Group
GANG Upcoming Meetings | GANG LinkedIn Group

+0

請發表你的表結構,我們可以更好地幫助 – 2010-04-30 18:47:31

回答

2

試試這個:

DECLARE @Employees table (DateOf datetime, EmployeeID int) 
INSERT @Employees VALUES ('01/01/2010',1) 
INSERT @Employees VALUES ('02/01/2010',1) 
INSERT @Employees VALUES ('04/01/2010',1) 
INSERT @Employees VALUES ('06/01/2010',1) 
INSERT @Employees VALUES ('02/01/2010',2) 
INSERT @Employees VALUES ('04/01/2010',2) 
INSERT @Employees VALUES ('05/01/2010',2) 

--I was unsure of the data in the question 
--this gives first day of each month for last six months 
DECLARE @StartDate datetime 
     ,@EndDate datetime 
SELECT @StartDate=DATEADD(month,-6,DATEADD(month,DATEDIFF(month,0,GETDATE()),0)) 
     ,@EndDate=GETDATE() 

;with AllDates AS 
(
    SELECT @StartDate AS DateOf 
    UNION ALL 
    SELECT DateAdd(month,1,DateOf) 
     FROM AllDates 
    WHERE DateOf<@EndDate 
) 
SELECT 
    dt.DateOf,dt.EmployeeID 
    FROM (SELECT DISTINCT 
       a.DateOf,e.EmployeeID 
      FROM AllDates     a 
       CROSS JOIN (SELECT DISTINCT EmployeeID FROM @Employees) e 
     ) dt 
     LEFT OUTER JOIN @Employees ee ON dt.EmployeeID=ee.EmployeeID AND dt.DateOf=ee.DateOf 
    WHERE ee.EmployeeID IS NULL 
    ORDER BY dt.EmployeeID,dt.DateOf 

OUTPUT:

DateOf     EmployeeID 
----------------------- ----------- 
2009-10-01 00:00:00.000 1 
2009-11-01 00:00:00.000 1 
2009-12-01 00:00:00.000 1 
2010-03-01 00:00:00.000 1 
2010-05-01 00:00:00.000 1 
2009-10-01 00:00:00.000 2 
2009-11-01 00:00:00.000 2 
2009-12-01 00:00:00.000 2 
2010-01-01 00:00:00.000 2 
2010-03-01 00:00:00.000 2 

(10 row(s) affected) 

這將每天都在做的過去六個月中,只是將這一在上面的,如果這是你想要什麼:

DECLARE @StartDate datetime 
     ,@EndDate datetime 
SELECT @StartDate=DATEADD(month,-6,GETDATE()) 
     ,@EndDate=GETDATE() 
;with AllDates AS 
(
    SELECT @StartDate AS DateOf 
    UNION ALL 
    SELECT DateOf+1 
     FROM AllDates 
    WHERE DateOf<@EndDate 
) 
SELECT * FROM AllDates 
--OPTION (MAXRECURSION 500) --uncomment and increase if the date range needs more rows 
1

填寫的日期範圍內的臨時表和外連接的臨時表到您的Emp *表,只返回你的臨時表有電磁脈衝的相應的行*表

1

如果在零記錄「再只回去個月的固定#,您可以precalc那些‘正月’日期和離開加入到你的員工數據:

SELECT d.DT, CASE WHEN e.DT IS NULL THEN 1 ELSE 0 END AS IsMissing 
FROM (
    SELECT DATEADD(m, DATEDIFF(m, 0, CURRENT_TIMESTAMP), 0) AS DT 
    UNION 
    SELECT DATEADD(m, DATEDIFF(m, 0, CURRENT_TIMESTAMP) - 1, 0) 
    UNION 
    SELECT DATEADD(m, DATEDIFF(m, 0, CURRENT_TIMESTAMP) - 2, 0) 
    UNION 
    SELECT DATEADD(m, DATEDIFF(m, 0, CURRENT_TIMESTAMP) - 3, 0) 
    UNION 
    SELECT DATEADD(m, DATEDIFF(m, 0, CURRENT_TIMESTAMP) - 4, 0) 
    UNION 
    SELECT DATEADD(m, DATEDIFF(m, 0, CURRENT_TIMESTAMP) - 5, 0) 
) AS d 
LEFT JOIN EmployeeDates e ON d.DT = e.DT AND e.EmpID = 1