Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找缺少的日期-vba Sql_Sql_Ms Access_Vba - Fatal编程技术网

查找缺少的日期-vba Sql

查找缺少的日期-vba Sql,sql,ms-access,vba,Sql,Ms Access,Vba,我试图找出哪个学生没有提交任务以及提交日期。我想检查每一个学生,不管是不是现在的。我不介意答案是sql还是vba代码。更多规格如下: Task Table ------------------------------- SubID |ID | Task | Date ------------------------------- 1 |1 | Dance | 01-01-2014 2 |1 | Sing | 02-01-2014 3 |1 | shou

我试图找出哪个学生没有提交任务以及提交日期。我想检查每一个学生,不管是不是现在的。我不介意答案是sql还是vba代码。更多规格如下:

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
预期结果:

谁在2014年1月1日至2014年1月6日期间未提交任务

我所尝试的:

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代码的任何帮助—基本上是对我的任务的任何提示—都将不胜感激

您应该能够在没有任何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表中为每个可能的学生提取一个条目,从t表中为每个可能的日期提取一个条目,并进行交叉联接,生成一个结果集,其中一行包含每个可能的学生的每个可能的日期。通过左键将其连接回taskTable(其中taskTable的日期字段为null),将只返回交叉连接表中没有与其关联的任务的条目


我还建议您重新考虑TaskTable的设计,不要只跟踪已完成的任务,而是跟踪所有任务并添加一个字段completed(已完成),用于存储任务是否已完成是否。

我使用了一个日历表,每个日期包含一行。将该表与student交叉连接,并将日期范围限制为6个值,得到30行6个日期乘以5个学生:

选择sub* 从…起 选择c.U日期,s.ID 从tblCalendar作为c,学生作为s 其中c.2014年1月1日至2014年6月1日 作为子 然后我将其用作子查询,并将其加入tasktbl。因此,右边为空的行是学生在讨论日期没有完成任务的行

选择sub.ID作为学生ID,sub.ID为日期 从…起 选择c.U日期,s.ID 从tblCalendar作为c,学生作为s 其中c.2014年1月1日至2014年6月1日 作为子 左连接任务TBL为t 分包ID=t.ID,分包日期=t.date 其中t.ID为Null 按sub.ID订购,sub.U日期;
这正是我的问题,任务各不相同。我有2000个任务代码。。。试试看,好吗examples@CodingEnthusiast他们在同一天有完全相同的任务吗?在2014年1月1日,每个人都应该有一个“舞蹈”任务?任务是随机分配的。。。每个人想学什么就学什么。因此,假设的一天没有假设的任务。我只想看看任务表中缺少了什么日期,而不是缺少了什么任务。这是一个很好的代码,但如果没有人填写时间表,那么我们就完蛋了,因为它在任务表中找不到日期,因此它会想好的,在那一点上不需要时间表,学生们,一旦他们弄明白了这一点,他们永远不会填写时间表。@CodingEnthusiast是的,如果没有人在某个日期完成任务,该日期将被忽略。但是你的问题没有具体说明你在处理任何其他的表格,或者关于这个问题的时间表,所以我必须处理给我的东西,在你的例子中,每个日期至少有一个这样的结果。我的建议是建立一个时间表,如果你还没有时间表,它们可以用于许多其他事情。你是否根据任务表数据确定任务是否已完成?您的输出有5个ID=3的条目,但您的数据中只有1个ID=3。它基于任务表数据。我的输出是正确的,因为从2014年1月1日到2014年6月1日,每个人都应该有6个条目。因此,如果在任务表中,该范围内缺少一个日期,那么输出将显示缺少的日期,在本例中,ID=3有五个缺少的日期。dd-mm-yyyy格式。我将在我的问题中指定它是日期字段文本还是日期/时间数据类型?yhup它是日期/时间数据类型。我用来创建和加载tblCalendar的过程可以在。。。这与我的答案完全相同,但语法稍有变化,edit就不完全一样了。您的查询从taskTable中提取参考日期;我的使用一个单独的日历表,每个日期一行。我的也是有效的访问SQL;你的不是。但他没有指定他有日历表。如果他没有IRL,他应该设置一个用于除了这个问题之外的其他用途…,但这超出了本文所提供信息的范围question@iliketocode您的初始代码甚至与此代码不太接近。hansup我调整了你的答案并创建了附加表。现在我将使用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