2014-02-07 6 views
0

В основном это система отчетности, в которой пользователь ежедневно сообщает о своей активности, поэтому я хочу проверить пользователей, которые не сообщают о своей повседневной деятельности.Как проверить отсутствие данных (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 | | | 

* обновление

Скажем столбцы в таблице пользователя являются: ID, Имя

столбцы в таблице отчета являются: ID, InputDate

И есть другая та BLE, ReportDetail, что есть столбец: идентификатор, ActivityType

+0

просьбе дать нам запрос на создать исходные таблицы, а также вставить в него несколько строк выборки. Если вам нужна помощь, вам нужно облегчить другим помощь вам. Chenqui. –

+0

Вы говорите «Как проверить наоборот»? но '2014-02-02' также находится между датами, которые вы упомянули? Что именно вы пытаетесь достичь? – NickyvV

+0

@BoratSagdiyev на самом деле это большая база данных, которая не сделана мной, поэтому я поставил вопрос простым. В основном это система отчетности, в которой пользователь ежедневно сообщает о своей деятельности, поэтому я хочу проверить пользователей, которые не сообщают о своей деятельности. Существуют 3 таблицы, таблица пользователей для данных пользователей, таблица ReportDetail для подробных отчетов и таблица Report для отношения между двумя. – user3282706

ответ

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 
+0

Это не я ищу. Он отображает отчеты, которые в другие даты. – user3282706

+0

Нечеткий qyestion, нет примера и образца. – hrishi

+0

Отредактировано уже, пожалуйста, повторите проверку. – user3282706

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) <[email protected]) 
,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 
+0

Msg 1033, уровень 15, состояние 1, строка 16 Предложение ORDER BY недействительно в представлениях, встроенных функциях, производных таблицах, подзапросах и общих табличных выражениях, если не указано значение TOP или FOR XML. – user3282706

+0

И если я удалю ORDER BY: Msg 4104, Level 16, State 1, Line 12 Идентификатор из нескольких частей «User.ID» не может быть связан. – user3282706

+0

@ user3282706 сначала запустите это «select dt from cte», тогда вы сами увидите, как вы можете присоединиться к cte и cte1 с помощью левого join.Or вы предоставляете данные образца – KumarHarsh

Смежные вопросы