计算关联名称(VBA,SQL)的连续date的实例

大家早上好,

我试图从数据集中确定连续date(不包括星期天)的实例。 数据存储在Access中,我将所需date拖到Excel中。 然后我试图确定每个人在提供的数据中有多less个实例。 下面的例子。

数据示例:

| Name | Date of absence| | Bob | 02/01/17 | | Jill | 02/01/17 | | Bob | 03/01/17 | | Jill | 04/01/17 | 

结果示例:

 Bob - 1 Instance, 2 days Jill - 2 Instance, 2 days 

我开始尝试在Excel中使用VBA来处理这个问题,使用循环遍历每一个缺席的情况,直到所有人都完成/打勾,但是代码变得非常麻烦并且感觉效率很低,更不用说它有多慢获得更大的数据集! 我想知道是否有可能查询数据库的信息或写一些更有效的东西。

任何帮助或build议,将不胜感激!

更新:

testing汤姆的build议;
Sql = "SELECT Absence.Racf,count(RecordDate) as dups" Sql = Sql & " FROM Absence" Sql = Sql & " left outer join" Sql = Sql & " (select Racf, [RecordDate]+IIf(Weekday([RecordDate],7)=1,2,1) as date1 from Absence) t1" Sql = Sql & " on Absence.RecordDate=t1.date1 and Absence.Racf=t1.Racf" Sql = Sql & " where date1 Is Not Null" Sql = Sql & " group by Absence.Racf"

但不幸的是,在下面的date列表中返回7,而不是5。

date:23-Feb-16,24-Feb-16,08-Aug-16,09-Aug-16,10-Aug-16,31-Aug-16,24-Oct-16,25-Oct-16, 10月26日-16,25-JAN-17,26-JAN-17,27-JAN-17

所以这就是SQL实际上在Access查询中的样子

 SELECT table1.name,count(date) as dups FROM Table1 left outer join (select name, [date]+IIf(Weekday([Date],7)=1,2,1) as date1 from table1) t1 on table1.date=t1.date1 and table1.name=t1.name where date1 is not null group by table1.name ; 

如果你想使用macros从Excel运行这个, 这里是一个有用的参考。

我从那里解除了代码,并改变了设置SQL查询string的行

 SQL = "SELECT table1.name,count(date) as dups" SQL = SQL & " FROM table1" SQL = SQL & " left outer join" SQL = SQL & " (select name, [date]+IIf(Weekday([Date],7)=1,2,1) as date1 from table1) t1" SQL = SQL & " on table1.date=t1.date1 and table1.name=t1.name" SQL = SQL & " where date1 Is Not Null" SQL = SQL & " group by table1.name" 

它工作正常。

如果你想得到长度大于1的序列,试试这个

 SELECT Absence.Racf, Count(Absence.RecordDate) AS CountOfRecordDate FROM (Absence LEFT JOIN (select Racf, RecordDate+IIf(Weekday([RecordDate],7)=1,2,1) as RecordDate1 from Absence) AS t1 ON (Absence.RecordDate = t1.RecordDate1) AND (Absence.Racf = t1.Racf)) LEFT JOIN (select Racf, [RecordDate]-IIf(Weekday([RecordDate],2)=1,2,1) as RecordDate2 from Absence) AS t2 ON (Absence.RecordDate = t2.RecordDate2) AND (Absence.Racf = t2.Racf) WHERE (((t1.RecordDate1) Is Not Null) AND ((t2.RecordDate2) Is Null)) GROUP BY Absence.Racf; 

或者,如果你想获得一个或多个连续date的序列

 SELECT Absence.Racf, Count(Absence.RecordDate) AS CountOfRecordDate FROM Absence LEFT JOIN (select Racf, [RecordDate]+IIf(Weekday([RecordDate],7)=1,2,1) as RecordDate2 from Absence) AS t2 ON (Absence.RecordDate = t2.RecordDate2) AND (Absence.Racf = t2.Racf) WHERE (((t2.RecordDate2) Is Null)) GROUP BY Absence.Racf; 

像以前一样添加到SQLstring中。

这可以使用Excel中的数组公式完成。 在DI中有=INDEX($A2:$A$15,MATCH(0,COUNTIF($D$1:$D1,$A2:$A$15),0))得到唯一雇员,那么在EI中有以下计算实例=SUM(--(($A$1:$A$15=D1)*(OFFSET($A$1:$A$15,1,0)=D1)*(OFFSET($B$1:$B$15,1,0)-$B$1:$B$15)=1))给出了这样的结果。 您需要添加另一个标准,基于weekday (稍后我会调整为时间不足),这依赖于date顺序的数据

在这里输入图像说明

编辑:我明白这不是完整的答案,将需要修改,一个出发点:o)

周日缺席(需要工作日检查):

=D1 & " " & COUNTIF($A$1:$A$15,D1) &" instances " & SUM(--(--($A$1:$A$15=D1)*--(OFFSET($A$1:$A$15,1,0)=D1))*--(--(OFFSET($B$1:$B$15,1,0)-$B$1:$B$15=1)+--(OFFSET($B$1:$B$15,1,0)-$B$1:$B$15=2)))&" Consecutive"

检查星期几也

=D2 & " " & COUNTIF($A$1:$A$15,D2) &" instances " & SUM(--(--($A$1:$A$15=D2)*--(OFFSET($A$1:$A$15,1,0)=D2))*--(--(OFFSET($B$1:$B$15,1,0)-$B$1:$B$15=1)+--(WEEKDAY(OFFSET($B$1:$B$15,1,0),2)=1)*((OFFSET($B$1:$B$15,1,0)-$B$1:$B$15=2)))) & " Consecutive"

在这里输入图像说明

基于表000Absence(这是来自示例EEName和AbsDate的数据),SQL方法将是一些东西。

 SELECT abs1.EEName, abs1.AbsDate, (select count(abs2.EEName) from 000Absence as abs2 where abs2.[EEName]=abs1.[EEName]) AS INSTANCES, (select count(abs3.EEName) from 000Absence as abs3 where abs3.[EEName]=abs1.[EEName] and abs3.[AbsDate]=abs1.[AbsDate]+iif(weekday(abs3.[AbsDate],7)=1,2,1)) AS CONSECUTIVE FROM 000Absence AS abs1; 

可以从查询中获得输出,由员工分组等。