栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

按周数访问SQL人数组

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

按周数访问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分钟…



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/670221.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号