当前位置: 首页 > 面试题库 >

按周数访问SQL人数组

商开济
2023-03-14
问题内容

给定一周的工作量,我需要计算有多少人在工作。

这是我的人员表(日期为美国格式):

name | surname| date_of_entry | date_of_exit
-----|--------|---------------|-------------
foo  | bar    | 1/1/2006      | 1/8/2006
foo1 | bar1   | 1/5/2010      |
foo2 | bar2   | 2/3/2015      | 3/4/2015

我希望在给定的一年中,所有星期数都与在此期间工作的适当人数保持一致。
希望您能理解我,因为英语不是我的母语。

我已经进行了一些研究,根据我的理解,根据以上示例,我需要创建一张表,从2006年1月1日开始,到“现在”结束(因为没有退出日期的人仍在工作)。能够测试每个人是否在本周内在工作,因此我可以在查询中算出他。

我仍然是一名学生程序员,但对我来说这似乎是一个非常复杂的SQL查询。

2006年查询的预期输出(新年从星期一开始):

week_number | count
------------|------
   1        | 1
   2        | 1
   3        | 0
   etc..    | 0

直到1/5/2010,其中所有星期在“计数”字段中都有1,然后 查询2015年:

week_number | count
------------|------
   1        | 1
   2        | 1
   ...      | 1
   9        | 2
   ...      | 2
   14       | 1
   ...      | 1

如果有人可以帮助我解决这个问题,那就太好了,谢谢!


问题答案:

您很幸运,我不得不改变主意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 Y

End Sub

Calendar 该表现在可以使用了:

ID  Cal_year    Cal_week
1   2006        1
2   2006        2
3   2006        3
4   2006        4
5   2006        5
    and so on...

步骤2:建立查询

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

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

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

SELECT Cal_year, Cal_week, DateAdd("ww",Cal_week,DateSerial(Cal_year,1,1)) AS thedate
FROM Calendar

Cal_year    Cal_week    thedate
2006            1       8/01/2006
2006            2       15/01/2006
2006            3       22/01/2006
2006            4       29/01/2006
2006            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_date
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))
ORDER BY  C.Cal_year, C.Cal_Week

Cal_year    Cal_Week pname      psurname    date_of_entry       exit_date
2006            1   foo         bar         1/01/2006               8/01/2006
2010            1   foo1        bar1        5/01/2010               22/04/2016 13:04:39
2010            2   foo1        bar1        5/01/2010               22/04/2016 13:04:39
2010            3   foo1        bar1        5/01/2010               22/04/2016 13:04:39
2010            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 cnt
FROM
(         
    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=2015
GROUP BY yyyy, ww
ORDER BY yyyy, ww

yyyy    ww  cnt
2015    1   1
2015    2   1
2015    3   1
2015    4   1
2015    5   1
2015    6   1
2015    7   1
2015    8   1
2015    9   2
2015    10  2
2015    11  2
2015    12  2
2015    13  2
2015    14  1
2015    15  1
2015    16  1

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



 类似资料:
  • 问题内容: 我是PHP和SQL领域的一名新开发人员。到目前为止,我只完成了Objective- C编程。但是,我的一个项目要求我拥有一个在线数据库,我需要从我的应用程序访问该数据库。我打算使用该框架来远程访问数据库,如下所示: 但这是行不通的,因为我联系了我的托管服务提供商,并且他们已经对其进行了设置,因此我无法从外部主机访问我的数据库(出于安全性考虑)。因此,我将不得不寻找替代方案。我唯一想到的

  • 如何通过键访问Groupby对象中相应的Groupby数据框? 使用以下groupby: 我可以迭代它来获取密钥和组: 我想能够访问一个组的关键: 但是当我试着用这样做时,我得到了一个奇怪的对象,它似乎没有任何与我想要的数据帧对应的方法。 我能想到的最好的办法是: 但是考虑到熊猫在这些事情上通常有多好,这有点令人讨厌。 这样做的内置方法是什么?

  • 问题内容: 通过这个简单的功能,我可以获得星期几。现在,用星期几,如何获取从星期日开始的日期范围? 欢迎任何帮助。谢谢。 问题答案: 前言: 返回您从星期一开始的星期数,因此我将回答您的问题,该问题也处理从星期一开始的星期。如果您希望它在周日开始的几周内工作,请根据需要进行更改。 我在中发布了该实用程序,请参见。 标准库没有提供可以返回给定星期(年+周数)的日期范围的函数。因此,我们必须自己构建。

  • 问题内容: 与此问题类似,但我的数据集还有一个包含许多ID的附加列。每个ID的数据集的返回时间都是固定的,有些星期可能会丢失数据- 我想填写缺少的几周的值。 例如,我想要这样: 扩展为: 我已经填写了我要填写的WEEKEND_DAY(在上述情况下,从2012年1月1日至2012年1月15日,每周)的已知范围。如何执行此操作? 问题答案: 使用分区外部联接:

  • 我试图使用Saxon SQL Extension从XSL模板中获取SQL Server的数据。但我得到一个错误: xsl中的错误:复制/@选择在sqlserver_books.xsl的第36行第60列: XTDE1450:未知扩展指令 未知扩展指令 < li>Saxon版本:SaxonPE 9-7-0-11 < li>Java版本:1.8.0_60 命令: sqlserver_books.xsl