我在尝试在查询中对记录进行分组时遇到了问题 我需要的是 - 在我从一个组合框中选择DatePeriod后 - 在一个基础子表单中,以便在选定的日期期间内为每个员工记录一个记录。
概述
注意:为简单起见,我只使用了两个字段。
主窗体有TabControl。每个Tab都有一个子表单(Source:query)。查询中的每条记录都有Date(V_LOCATION_VISIT_DATE)和Employee(V_WORKER)字段。每个V_WORKER
都有数百个条目(链接到Oracle数据库)。
在表格上我有cboDatePeriod(例如:“16.05.2018-15.06.2018”)。
从cboDatePeriod中选择一个值后,代码会将DatePeriod与查询中的日期进行比较并对其进行过滤。
查询对qryEmployees有INNER JOIN,因为我想计算特定Employees的记录。
表DATA 中的条目示例:
|V_WORKER | V_LOCATION_VISIT_DATE
| David Sylvian | 08.01.2018 14:38:21
| David Sylvian | 08.01.2018 15:31:48
| David Sylvian | 08.01.2018 16:22:07
| Brian Eno | 08.01.2018 17:33:07
| Brian Eno | 09.01.2018 16:18:50
| Brian Eno | 09.01.2018 17:09:21
没有日期的代码:
SELECT qryDATA.V_WORKER,Count(qryDATA.V_WORKER) AS CountOfV_WORKER
FROM qryEmployeesCZS DATA ON qryEmployeesCZS.FullName = qryDATA.V_WORKER
GROUP BY qryDATA.V_WORKER
HAVING (((qryDATA.V_WORKER)<>""));
查询结果示例:
|V_WORKER | CountOfV_WORKER
| David Sylvian | 821
| Brian Eno | 92
应用DatePeriod过滤器后应该看起来如何, 。让我们继续前进。
包含日期的代码:
使用Date included int函数删除时间戳)而不是每个Employee有一条记录我有每个Employee的许多记录,其中每条记录是一天的记录数(按V_WORKER和DAY分组)。
SELECT qryDATA.V_WORKER, Int([qryDATA].[V_LOCATION_VISIT_DATE]) AS V_LOCATION_VISIT_DATE,
Count(qryDATA.V_WORKER) AS CountOfV_WORKER
FROM DATA
INNER JOIN qryEmployeesCZS ON qryDATA.V_WORKER = qryEmployeesCZS.[FullName]
GROUP BY qryDATA.V_WORKER,Int([DATA].[V_LOCATION_VISIT_DATE])
HAVING (((qryDATA.V_WORKER)<>""));
查询结果示例(我使用int函数删除时间戳):
| V_WORKER | V_LOCATION_VISIT_DATE | CountOfV_WORKER
| David Sylvian | 08.01.2018 | 4
| David Sylvian | 09.01.2018 | 6
| David Sylvian | 10.01.2018 | 2
| Brian Eno | 11.01.2018 | 4
| Brian Eno | 12.01.2018 | 2
| Brian Eno | 15.01.2018 | 5
| Brian Eno | 16.01.2018 | 3
我想要的是什么:
从comboBox中选择Date period后,我想计算按V_WORKER分组的记录 - 它应该如下所示:
| V_WORKER- | CountOfV_WORKER
| David Sylvian | 26
| Brian Eno | 17
我尝试在子窗体中使用文本框来计算记录,但当然它会计算所有记录,而不是按员工分组。
我正在考虑(在绝望的时刻)在子表单中有两个查询:queryOne将包含所有日期和没有分组的记录,第二个(source:queryOne)具有已删除的Date字段和分组包括在内。
有什么想法吗?
答案 0 :(得分:0)
这是聚合和GROUP BY的工作方式。
如果按日期分组,您将获得每个日期的计数
如果您只想按员工分组以获得完整计数,那么请执行此操作。从GROUP BY子句中删除V_LOCATION_VISIT_DATE
。
您希望在完整计数的哪个日期获得?首先?最后?然后使用MIN()
或MAX()
聚合函数作为日期。
从评论中编辑:
然后日期进入WHERE子句,如下所示:
SELECT qryEmployees.EmployeeName, Count(*) AS EmpCount
FROM (Data_Servisi INNER JOIN qryEmployees ON Data_Servisi.WORKER = qryEmployees.EmployeeName) INNER JOIN City ON qryEmployees.CityID = City.CityID
WHERE Data_Servisi.V_LOCATION_VISIT_DATE BETWEEN Forms!myForm!DateStart AND Forms!myForm!DateEnd
GROUP BY qryEmployees.EmployeeName