【问题标题】:Counting/grouping records in Access queryAccess查询中的计数/分组记录
【发布时间】:2018-06-13 15:57:39
【问题描述】:

我在尝试对查询中的记录进行分组时遇到问题。
我需要的是 - 在我从组合框中选择 DatePeriod 之后 - 在基础子表单中计算每个员工在选定日期期间的记录数。

概览

注意:为简单起见,我只使用了两个字段。

主窗体有 TabControl。每个选项卡都有一个子表单(来源:查询)。查询中的每条记录都有日期 (V_LOCATION_VISIT_DATE) 和员工 (V_WORKER) 字段。每个V_WORKER 都有数百个条目(链接到Oracle db)。

在我有 cboDatePeriod 的表单上(例如:„16.05.2018-15.06.2018“)。
从 cboDatePeriod 中选择一个值后,代码将 DatePeriod 与查询中的日期进行比较并过滤它。

一个查询对 qryEmployees 进行了 INNER JOIN,因为我想计算特定员工的记录。

表 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 过滤器之后应该是这样的。让我们继续吧。

包含日期的代码:
使用包含日期的 int 函数来删除时间戳)而不是为每个员工提供一条记录我为每个员工有许多记录,其中每条记录是一天的记录计数(按 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   

我想要什么:
从组合框中选择日期期间后,我想计算按 V_WORKER 分组的记录 - 它应该如下所示:

|    V_WORKER-  | CountOfV_WORKER   
| David Sylvian |     26    
| Brian Eno     |     17

我尝试在子表单中使用文本框来计算记录,但它当然会计算所有记录,而不是按员工分组。

我正在考虑(在绝望的时刻)在一个子表单中有两个查询:queryOne 将包含所有带有日期且没有分组的记录,第二个(来源:queryOne)将删除 Date 字段和分组包括在内。

有什么想法吗?

【问题讨论】:

  • 为什么不直接统计EmployeeName字段呢?在不知道您的数据结构的情况下,我可能会遗漏一些东西。

标签: ms-access count filtering


【解决方案1】:

这就是聚合和 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

【讨论】:

  • 现在我看到我写的问题很匆忙。使用 CountOfWorker,我每天都会进行计数,即 9 月 1 日有 8 个条目,5 月 2 日有 5 个条目,等等。我想要的是计算每个工人有多少条记录。在上面的示例中,它的总和为 8+5=13。但这必须在我的表单中完成,因为我想知道日期期间有多少条目,即 1.9.2017-1.10.2017。问题是,如果我对表格中的记录求和(在查询中每天计算),我会得到所有工作人员的所有记录的总和,而不是按工作人员分组。这可以在报告中完成,但我需要它的形式。
  • Andre,如果我按 WORKER 分组,则会收到错误消息“您尝试执行的查询不包含指定表达式“V_LOCATION_VISIT_DATE”作为聚合函数的一部分。”。如果我将计数添加到 V_LOCATION_VISIT_DATE我会得到所有记录的计数。但我仍然需要 V_LOCATION_VISIT_DATE 信息 - 如果我添加它,结果将再次按每个日期计数,而不是累积。我需要的是在应用日期期间过滤器后对子表单中的数据进行分组. 请注意:格式化文本对我不起作用,不知道为什么。在编辑模式下,它已格式化,但当我保存时,它就消失了。
  • @Vedran:请编辑您的问题以添加更多信息,例如您尝试的当前查询。另外请添加示例数据和预期结果 - 我真的不明白你想要实现什么。见How to ask a good SQL question
  • 这就是我需要 V_LOCATION_VISIT_DATE 的原因:假设每个员工有 12 个条目。每个为一个月。在表单上的组合框中,我选择 TimePeriod,即 January-February。选择时间段后,在一个子表单中,我将为每位员工输入 2 个条目,然后我将为每位员工计算这些记录。想法是计算每个技术人员在选定的时间段内输入了多少记录(条目)。这就是为什么我需要 V_LOCATION_VISIT_DATE - 来缩小每个员工的记录数量,并只计算所选日期期间内的记录。对于 aech 员工。
  • 正如我所写:然后日期进入 WHERE 子句,请参阅上面的编辑@Vedran
猜你喜欢
  • 1970-01-01
  • 2015-08-14
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 2022-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多