如何检查数据缺失(SQL Server 2008)

时间:2014-02-07 07:17:42

标签: sql sql-server sql-server-2008

基本上这是一个报告系统,用户每天报告他们的活动,因此我想检查那些不报告日常活动的用户。

我使用此查询加入2个表格,以检查在特定日期报告的人员

SELECT DISTINCT Report.InputDate, User.ID, User.Name
FROM User JOIN Report on User.ID = Report.ID 
WHERE Report.InputDate BETWEEN '2014-02-01' AND '2014-02-04'
ORDER BY Report.InputDate

因此,如果有人在2014-02-02没有报告,结果将是:

2014-02-01 | Guy | 01 |
2014-02-03 | Guy | 01 |

我正在寻找的是如何检查查询中日期范围内未报告的人,结果将是:

2014-02-02 | Guy | 01 |

(如果可能的话,它会显示一行,其中的日期甚至没有人报告,所以如果没有人在2014-02-01报告结果的话):

2014-02-01 |  |  |

*的更新

假设表User中的列是:ID,Name

表格报告中的列是:ID,InputDate

另一个表ReportDetail包含列:ID,ActivityType

2 个答案:

答案 0 :(得分:0)

尝试执行此

SELECT DISTINCT Report.InputDate, User.NIMK, User.NamaLengkap
FROM User JOIN Report on User.ID = Report.ID 
WHERE not (Report.InputDate  between '2014-02-01' AND '2014-02-04')
ORDER BY Report.InputDate 

答案 1 :(得分:0)

我认为您需要列出每个日期状态(现在或不存在)

Declare @startdate date='2014-02-01' 
Declare @enddate date= '2014-02-04'

;with cte as
(Select @startdate as dt
union all
select DATEADD(day,1,dt) dt from cte a 

where  DATEADD(day,1,dt) <=@enddate )
,cte1 as
(
SELECT DISTINCT Report.InputDate, User.NIMK, User.NamaLengkap
FROM User JOIN Report on User.ID = Report.ID 
WHERE Report.InputDate BETWEEN '2014-02-01' AND '2014-02-04'

)
--select dt from cte --check this one
select  * from cte a left join cte1 b on a.dt=b.InputDate -- correct this yourself