Contagem/agrupamento de registos na pesquisa de acesso
O que eu preciso é - depois de selecionar período de dados de um comboBox - em uma sub-forma subjacente para ter uma contagem de registros para cada empregado dentro do período de data selecionada.
Introdução
Nota: para simplificar, usei apenas dois campos. o formulário principal tem o TabControl. Cada página tem uma sub-forma (Fonte: query). Cada registro de uma consulta tem data (V_LOCATION_VISIT_DATE) e empregado (V_WORKER) fields. Cada V_WORKER
tem centenas de entradas (ligação à Oracle db).
num formulário tenho um prazo de validade (exemplo: "16.05.2018-15.06.2018").
Depois de selecionar um valor de um cboDatePeriod, um código compara o período de dados com datas em uma consulta e filtra-o.
exemplo de entradas em uma tabela de Dados:
|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
Código Sem data :
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)<>""));
Exemplo do resultado da Pesquisa:
|V_WORKER | CountOfV_WORKER
| David Sylvian | 821
| Brian Eno | 92
é como deve ser, Depois de aplicar o filtro do período de dados. Vamos continuar.
Código com data incluída:
Com a data incluída na função int para remover o selo de tempo) em vez de ter um único registro para cada empregado eu tenho muitos registros para cada empregado, onde cada registro é uma contagem de registros por um único dia (agrupado por V_WORKER e 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)<>""));
exemplo do resultado da pesquisa (eu usei int função para remover a data-limite):
| 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
O Que Eu quero:
Depois de seleccionar o período de data de um comboBox, quero contar um registo agrupado por V_ worker - deverá ficar assim:
| V_WORKER- | CountOfV_WORKER
| David Sylvian | 26
| Brian Eno | 17
Tentei com uma caixa de texto numa sub-forma que conta os registos, mas claro que conta todos os registos, Não agrupados por empregado.
O que estou a pensar (num momento de desespero) é ter duas perguntas numa sub-reforma: queryOne terá todos os registos com datas e sem agrupamento, e um segundo (fonte: queryOne) com o campo de data removido e agrupamento incluído.
Alguma ideia?
1 answers
Se agrupar por data, receberá a contagem por data.
Se você quer apenas agrupar por empregado para obter a contagem completa, então faça isso. Remover V_LOCATION_VISIT_DATE
do grupo por cláusula.
Que data você gostaria de ter com a contagem completa? O primeiro? O último? Em seguida, use MIN()
ou MAX()
funções agregadas para a data.
Editar do comentário:
Então a data vai para a cláusula onde, como isto:
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