按周数访问SQL人数组

按周数访问SQL人数组,第1张

按周数访问SQL人数组

您很幸运,我不得不改变主意15分钟。


第1步:创建日历表

创建一个

Calendar
具有以下字段的新表

  • id
    :自动编号
  • Cal_Year
    : 数字
  • Cal_Week
    : 数字

在一个模块中,添加以下代码并执行它(F5):

Private Sub Create_Calendar_table()    Dim Y As Integer    Dim W As Integer    For Y = 2006 To 2016        For W = 1 To 52 DoCmd.RunSQL "INSERT INTO Calendar (cal_year, cal_week) VALUES (" & Y & "," & W & ")"        Next W    Next YEnd Sub

Calendar
该表现在可以使用了:

ID  Cal_year    Cal_week1   2006        12   2006        23   2006        34   2006        45   2006        5    and so on...

步骤2:建立查询

请注意,我在欧洲,所以我的日期是DD / MM。 这不会影响您的结果。

我会分解,以便您了解该过程。

首先,我们需要从日历表中的年/周创建一个日期,可以像这样实现

SELECt Cal_year, Cal_week, DateAdd("ww",Cal_week,DateSerial(Cal_year,1,1)) AS thedateFROM CalendarCal_year    Cal_week    thedate2006 1       8/01/20062006 2       15/01/20062006 3       22/01/20062006 4       29/01/20062006 5       5/02/2006   and so on...

接下来,由于我们将处理日期范围,因此重要的是,当人们的exit_date为时,将 当前日期 归属为

NULL
,例如:

nz(date_of_exit, Now)

字段已准备就绪。

然后,把戏。

我们需要将

JOIN
日历表与人员表一起使用,以这种方式将返回每个人在场的记录。

实现这一目标的关键是

ON...BETWEEN...AND

SELECt C.Cal_year, C.Cal_Week, P.pname, P.psurname, P.date_of_entry, nz(P.date_of_exit, Now) AS exit_dateFROM [Calendar] CINNER JOIN ( SELECt [Name] AS pname, [surname] as psurname, date_of_entry, date_of_exit FROM people) P  ON (DateAdd("ww",C.Cal_week,DateSerial(C.Cal_year,1,1)) BETWEEN P.date_of_entry  AND nz(P.date_of_exit, Now))ORDER BY  C.Cal_year, C.Cal_WeekCal_year    Cal_Week pname      psurname    date_of_entry       exit_date2006 1   foo         bar         1/01/2006    8/01/20062010 1   foo1        bar1        5/01/2010    22/04/2016 13:04:392010 2   foo1        bar1        5/01/2010    22/04/2016 13:04:392010 3   foo1        bar1        5/01/2010    22/04/2016 13:04:392010 4   foo1        bar1        5/01/2010    22/04/2016 13:04:39

请注意,如果您需要自2006年以来的所有周,即使没有周,也

INNER JOIN
可以使用
LEFT JOIN

最后,我们利用上一个查询通过

GROUP BY
对日历表的年和周进行计数来计算存在
,并在
WHERe
子句中指定2015年,否则它将对2006年以来的所有事件进行计数。这意味着计数非常容易一年的存在。

SELECt yyyy, ww , count(*) AS cntFROM(  SELECt C.Cal_year AS yyyy, C.Cal_Week AS ww    FROM [Calendar] C    INNER JOIN ( SELECt [Name] AS pname, [surname] as psurname,  date_of_entry,   date_of_exit     FROM people    ) P  ON (DateAdd("ww",C.Cal_week,DateSerial(C.Cal_year,1,1)) BETWEEN P.date_of_entry  AND nz(P.date_of_exit, Now)))WHERe yyyy=2015GROUP BY yyyy, wwORDER BY yyyy, wwyyyy    ww  cnt2015    1   12015    2   12015    3   12015    4   12015    5   12015    6   12015    7   12015    8   12015    9   22015    10  22015    11  22015    12  22015    13  22015    14  12015    15  12015    16  1

好吧,我终于花了40分钟…



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5675466.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存