给定一周的工作量,我需要计算有多少人在工作。
这是我的人员表(日期为美国格式):
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分钟。
创建一个Calendar
具有以下字段的新表
id
:自动编号Cal_Year
: 数字Cal_Week
: 数字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...
请注意,我在欧洲,所以我的日期是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