【问题标题】:SQL join count of date ranges to table of calendar dates?SQL将日期范围的计数加入日历日期表?
【发布时间】:2018-03-20 06:48:08
【问题描述】:

我缺席了

Name    Start   End
Joe    18-Mar-2018 0800 26-Mar-2018 1830
Mary    19-Mar-2018 0010    19-Mar-2018 2349
Adam    21-Mar-2018 0700    21-Mar-2018 1300

是否有一个 SQL 查询可以创建一个包含当天缺席人数的新日期表?

Date    Absent
18-Mar-18   1
19-Mar-18   2
20-Mar-18   3

我知道如何从日历表中创建一个记录集,基本上是 rs1.movenext 到每个日期,同时我更新 tblTemp 的计数满足

WHERE tblAbsence.start <= rs1.date AND tblAbsence.End >= rs1.date;

但是当可能存在某种可能有效的 JOIN 类型时,这似乎是可笑的重复?

【问题讨论】:

  • 你有日历表或数字表吗?
  • tblAbsence 的开始和结束是 DTG
  • 您可以利用here 所述的一系列日期。
  • 谢谢,但创建日期列表不是问题...我实际上是从另一个列表中构建该 tbl。我只是不熟悉如何加入他们。

标签: sql ms-access ms-access-2013


【解决方案1】:

如果您有日期列表,那么问题就很简单了。您可以使用子查询从缺勤列表中计数,其中列表中的日期介于缺勤的开始和结束之间。:

SELECT TheDate, (SELECT Count(Name) FROM Absent WHERE Absent.End > DateList.TheDate AND Absent.Start < DateList.TheDate + #23:59:59#) As Absent
From DateList

其中 DateList 是您感兴趣的所有日期的列表(来自表格或来自 Gustav 的查询)

【讨论】:

  • 到达那里,但 Query.recordcount = Datelist.recordcount * Absent.recordcount。因此,如果在 Datelist for ex 中只有 3 个日期,您将获得比 Absent 大 3 倍的记录数
  • SELECT datelist.Date, (SELECT Count(tblAbsence.Name) FROM tblAbsence WHERE tblAbsence.End &gt;= datelist.Date AND tblAbsence.Start &lt;= datelist.Date) AS Absent FROM datelist, tblAbsence;
  • 这不是我分享的 SQL。删除该交叉连接。它破坏了查询。此外,您还删除了+#23:59:59#,使得最后一天的缺勤不算数。
【解决方案2】:

您可以尝试以下方法:

select rs1.date,count(ta.Name) from Calendar rs1
    join tblAbsence ta on (ta.start<DATEADD(day,1,rs1.date) and ta.end >=rs1.date)
group by rs1.date
order by rs1.date

【讨论】:

  • 这不是有效的 Access (JET/Ace) SQL。连接会失败,如果你修复它,它会提示你输入一个参数(天)。
  • 其实从Access-2013开始就允许外连接了,帖子里有ms-access-2013标签。
  • 不是外连接。据我所知,他们自始至终都是被允许的。它是连接中的多重比较和计算,没有括号。你可以在Access中试一试,你会发现它不起作用。此外,Count(*) + a LEFT JOIN 将在应该返回 0 的地方返回 1。
猜你喜欢
  • 2012-10-22
  • 2017-04-27
  • 2011-01-19
  • 1970-01-01
  • 2012-06-02
  • 2021-10-05
  • 2020-05-23
  • 1970-01-01
  • 2021-05-27
相关资源
最近更新 更多