我在Microsoft Access中有一个表,其中包含一个事件志愿者列表。该表包含姓名,电话号码等字段。还有三个字段;分配,描述志愿者将分配给哪些活动。例如,停车场,前门,售票亭等。另外两个领域,开始和结束时间描述志愿者何时能够工作。
是否可以编写一个查询 - 可能是某种数据透视表 - 如果时间段已填入作业,则有2小时的时间段作为行标题和某种真/假值?活动时间为早上6点至下午6点。
例如:
Assignment | 0600 | 0800 | 1000 | 1200 | 1400 | 1600
Parking | X | o | X | X | X | X
TicketBooth| o | o | X | o | X | o
我正在尝试按照他们的任务对志愿者进行分组,并从每个志愿者的开始和结束时间中获得两小时的时间段,并生成一份报告,以便活动协调员能够轻松区分是否需要添加志愿者分配。
志愿者表格结构如下:
FirstName | LastName | Assignment | StartTime | EndTime
Joe | Smith | Parking | 1000 | 1800
Jessica | Anderson | Parking | 0600 | 0800
Ryan | Webber | TicketBooth | 1000 | 1200
Michael | Flent | TicketBooth | 1400 | 1600
在给定表结构的情况下,是否可以生成查询以获取上面示例中显示的结果?如果没有,我需要修改什么?
答案 0 :(得分:2)
我创建了一个时间块表,其中包含日期/时间字段的开头和结尾
每个街区。然后CROSS JOIN
加上包含志愿者的表格。分配,并将其用作交叉表查询的数据源。
这是以下查询的结果集......
注意:
这是查询...
TRANSFORM Count(q.block_start) AS CountOfBlock_start
SELECT q.Assignment
FROM
(
SELECT a.Assignment, tb.block_start
FROM assignments AS a, time_blocks AS tb
WHERE
tb.block_start >= [a].[StartTime]
AND tb.block_end <= [a].[EndTime]
) AS q
GROUP BY q.Assignment
PIVOT Format(q.block_start, 'hhnn')
IN ('0600','0800','1000','1200','1400','1600');
这是我的 time_blocks 表...
block_start block_end
----------- -----------
6:00:00 AM 8:00:00 AM
8:00:00 AM 10:00:00 AM
10:00:00 AM 12:00:00 PM
12:00:00 PM 2:00:00 PM
2:00:00 PM 4:00:00 PM
4:00:00 PM 6:00:00 PM
答案 1 :(得分:1)
好的,所以考虑到你的样本数据,一个Pivot表并不理想,因为缺少一个表/连接表有时间,谁可以工作等等。
所以,我创建了一个返回"o"
或"x"
的函数,具体取决于某人的可用性是否符合您为我们提供示例的时间段。唯一不好的是你必须为每个时隙手动创建一个列。这对于Pivot表来说是件好事。
这也可以使用IIf()
来完成。以下是一个简单的例子:
SELECT volunteers.Names,
volunteers.Assignment,
IIf(1800>=[Start] And 1800<=[End],"Can Work","Can't") AS 1800
FROM volunteers;
无论如何,这里的功能(我没有处理任何错误):
Option Compare Database
Option Explicit
Public Function IsAvailable(time, starttime, endtime) As String
Dim AvailableTime, StartingTime, EndingTime As Integer
AvailableTime = time
StartingTime = starttime
EndingTime = endtime
If AvailableTime >= StartingTime And AvailableTime <= EndingTime Then
IsAvailable = "o"
Else
IsAvailable = "x"
End If
End Function
如何在查询中使用它:
SELECT volunteers.Names,
volunteers.Assignment,
IsAvailable(600,[Start],[End]) AS 0600,
IsAvailable(800,[Start],[End]) AS 0800,
IsAvailable(1000,[Start],[End]) AS 1000,
IsAvailable(1200,[Start],[End]) AS 1200,
IsAvailable(1400,[Start],[End]) AS 1400,
IsAvailable(1600,[Start],[End]) AS 1600,
IsAvailable(1800,[Start],[End]) AS 1800
FROM volunteers;
可视化:
注意:我在表格中使用了Start
和End
作为我的列名,因此您必须分别更改[Start]
和[End]
。
另外,我个人认为这不是最好的解决方案。我想如果你知道这些数据需要采用这种格式,我可能会为它设计我的数据库,但这是一种粗略的解决方法。