2015-05-25 3 views
1

Я пытаюсь определить, какой студент не представил свою задачу и на какую дату. Я хочу проверить для каждого учащегося, есть ли это или нет. Я не возражаю, если ответ находится в коде sql или vba. Больше спецификации ниже:Найдите недостающие даты - vba Sql

Task Table 
------------------------------- 
SubID |ID | Task | Date 
------------------------------- 
1  |1 | Dance | 01-01-2014 
2  |1 | Sing | 02-01-2014 
3  |1 | shout | 05-01-2014 
4  |2 | try | 02-01-2014 
5  |3 | Okay | 01-01-2014 
6  |2 | random| 06-01-2014 
8  |4 |Jumping| 01-01-2014 
9  |4 | try | 02-01-2014 
10  |4 | Piano | 03-01-2014 
11  |4 | try | 04-01-2014 
12  |4 | guitar| 05-01-2014 
13  |4 | try | 06-01-2014 

Student table --the Date is in the dd-mm-yyyy format. - also it is a date/time datatype 

ID | Name | Current 
-------------------- 
1 | Ron | YES 
2 | sqlJ | YES 
3 | jque | NO 
4 | holy | YES 
5 | htdoc| YES 

Желаемый результат:

Кто не представил свою задачу между 01-01-2014 и 06-01-2014

ID | Date 
--------------- 
1 | 03-01-2014 
1 | 04-01-2014 
1 | 06-01-2014 
2 | 01-01-2014 
2 | 03-01-2014 
2 | 04-01-2014 
2 | 05-01-2014 
3 | 02-01-2014 
3 | 03-01-2014 
3 | 04-01-2014 
3 | 05-01-2014 
3 | 06-01-2014 

То, что я пробовал:

SELECT w.ID, w.Date, student.[first name], student.[last name], student.[id] 
FROM tasktbl AS w 
    right join student 
      on w.id = student.[id]; 

//I was thinking of using a vba-for loop to iterate over the range of date and store it in an array spot every Id that doesn't have a date but it didn't work out quite well. 

Любая помощь от псевдо-кода до sql-кода до vba-кода (в основном любой намек к моему квесту) будет оценен

+0

Как вы определяете, была ли выполнена задача на основе данных таблицы задач? ваш вывод имеет 5 записей для ID = 3, но ваши данные содержат только 1 ID = 3. – iliketocode

+0

он основан на данных таблицы задач. Мой результат прав, потому что каждый должен иметь 6 записей с 01-01-2014 по 06-01-2014 включительно. поэтому Если в таблице задач есть недостающая дата в этом диапазоне, тогда на выходе будет отображаться отсутствующая дата, в этом случае ID = 3 имеет пять отсутствующих дат. –

+0

Формат dd-mm-yyyy. я укажу его в своем вопросе –

ответ

1

Я использовал таблицу календаря, которая содержит одну строку для каждой даты. Крест присоединиться к этой таблице с студента и ограничивая диапазон дат для ваших 6 значений дал мне 30 строк (6 дат раз 5 студентов):

SELECT sub.* 
FROM 
    (
     SELECT c.the_date, s.ID 
     FROM tblCalendar AS c, student AS s 
     WHERE c.the_date Between #1/1/2014# And #1/6/2014# 
    ) AS sub 

Тогда я использовал это в качестве подзапроса и LEFT JOIN эд его до tasktbl. Таким образом, строки, где «правая сторона» - «Нуль», - это те, в которых ученик не выполнил задачу на рассматриваемую дату.

SELECT sub.ID AS student_id, sub.the_date 
FROM 
    (
     SELECT c.the_date, s.ID 
     FROM tblCalendar AS c, student AS s 
     WHERE c.the_date Between #1/1/2014# And #1/6/2014# 
    ) AS sub 
    LEFT JOIN tasktbl AS t 
    ON (sub.ID = t.ID) AND (sub.the_date = t.Date) 
WHERE t.ID Is Null 
ORDER BY sub.ID, sub.the_date; 
+0

Процедуры, которые я использовал для создания и загрузки моего * tblCalendar *, можно найти в [this SO answer] (http://stackoverflow.com/a/9303628/77335) – HansUp

+0

... это то же самое, что и мой ответ, но с синтаксисом слегка измененным – iliketocode

+0

Это не ** то же самое. Ваш запрос выводит контрольные даты из * taskTable *; шахта использует отдельную таблицу календаря с одной строкой для каждой даты. Mine также действителен Access SQL; твой нет. – HansUp

0

Вы должны быть в состоянии сделать это без каких-либо VBA.

select s.id, t.date 
from 
(--this will populate every possible date, for every student 
    select distinct s.id 
    from students s 
) s 
cross join 
(
    select distinct t.date 
    from taskTable t 
) t 
left join taskTable tt on s.id = tt.id and t.date = tt.date 
where tt.date is null 
--(optional) order by clause, if needed 

По сути, это делает тянет одну запись для каждого возможного студента (от «S» таблицы) и одну запись для каждой возможной даты (из таблицы «Т») и делает перекрестное соединение, который генерирует набор результатов с строкой, содержащей каждую возможную дату для каждого возможного ученика. Помещая это обратно обратно на taskTable (где поле даты TaskTable равно null) будет возвращать только записи из таблицы перекрестного соединения, которые имеют , а не имеют связанные с ними задачи.

Я бы также рекомендовал вам подумать о дизайне TaskTable и вместо отслеживания только выполненных задач отслеживать все задачи и добавлять поле «завершено», которое хранится, если задача выполнена (да) или нет (Нет).

+0

точно моя проблема, задача меняется. У меня есть 2000 кодов задач ... Попробуйте и все в порядке, где только примеры –

+0

@CodingEnthusiast ли они все имеют точно такие же задачи, в те же даты? ех. на 1/1/14, у всех должно было быть задание «Танец»? – iliketocode

+0

задание назначается случайным образом ... каждый изучает все, что хочет, когда захочет. поэтому нет предполагаемой задачи для предполагаемого дня. Все, что я хочу, это посмотреть, какие даты отсутствуют в таблице задач, а не какая задача отсутствует. –

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