在Access查询

时间:2018-06-13 15:57:39

标签: ms-access count filtering

我在尝试在查询中对记录进行分组时遇到了问题 我需要的是 - 在我从一个组合框中选择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字段和分组包括在内。

有什么想法吗?

1 个答案:

答案 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