按日期重叠的查询分组

时间:2019-06-11 14:49:31

标签: sql vba ms-access access-vba

我有一些数据可能需要重叠的日期进行了分组。首先,让我解释一下表格:

tblBusinessDays -此表包含所有工作日(已编号)。不要问我为什么,我继承了它。请注意,星期五,星期六和星期日重复的天数。他们在假期做同样的事情。

DayNumber   Date        Day
3           12/3/2003   Wednesday
4           12/4/2003   Thursday
5           12/5/2003   Friday
5           12/6/2003   Saturday
5           12/7/2003   Sunday
6           12/8/2003   Monday
7           12/9/2003   Tuesday

tblPends -此表列出了所有笔数(暂停交易的时间)。

ClientID    AcctNbr  TransID    InventoryID PendID  PendOpenDT  PendCloseDT 
0           0605161  8378488    1           97455   1/25/2012   2/9/2012    
0           0605161  8378488    1           98051   2/6/2012    2/17/2012

我当前拥有的查询用于记录,其中两个记录的PendOpenDt和PendCloseDt相同,或者打开和关闭日期不重叠。这是一个简单的“分组依据”查询,可捕获95%的数据。但是,我不知道如何处理上面的记录,第二条记录的PendOpenDt与上一条记录的PendCloseDt重叠。

这就是我所拥有的:

SELECT 
    tblPends.ClientID, 
    tblPends.AcctNbr, 
    tblPends.TransID,
    tblPends.InventoryID, 
    tblBusinessDays.DayNumber AS OpenDayNumber, 
    tblBusinessDays_1.DayNumber AS CloseDayNumber, 
    [tblBusinessDays_1].[DayNumber]-[tblBusinessDays].[DayNumber] AS TotalPendDays, 
    Sum(1) AS [Key]
FROM (tblPends 
    LEFT JOIN tblBusinessDays 
        ON tblPends.PendOpenDT = tblBusinessDays.Date) 
    LEFT JOIN tblBusinessDays AS tblBusinessDays_1 
        ON tblPends.PendCloseDT = tblBusinessDays_1.Date
GROUP BY 
    tblPends.ClientID, 
    tblPends.AcctNbr, 
    tblPends.TransID,
    tblPends.InventoryID, 
    tblBusinessDays.DayNumber, 
    tblBusinessDays_1.DayNumber, 
    [tblBusinessDays_1].[DayNumber]-[tblBusinessDays].[DayNumber]
HAVING (((
    tblPends.ClientID)=[Forms]![frmInventory]![ClientId]) 
    AND ((tblPends.AcctNbr)=[Forms]![frmInventory]![AcctNbr]) 
    AND ((tblPends.TransID)=[Forms]![frmInventory]![TransID])
    AND ((tblPends.InventoryID)=[Forms]![frmInventory]![InventoryID]));

返回的结果数据为:

ClientID    AcctNbr TransID  InventoryID   OpenDayNumber  CloseDayNumber   TotalPendDays    Key
0           0605161 8378488  1             2065           2076             11               1
0           0605161 8378488  1             2073           2082              9               1

结果是,TotalPendDays增加到20,而应该只增加到17。在上述情况下,期望的结果可能是返回的记录,TotalPendDays等于17。

ClientID    AcctNbr TransID  InventoryID   TotalPendDays    Key
0           0605161 8378488  1             17               1

只要我有AcctNbr,ClientID和TransID,就可以链接回并获取其余数据。

如果我有这样的东西:

ClientID    AcctNbr TransID  InventoryID   OpenDayNumber  CloseDayNumber   TotalPendDays    Key
0           0605161 8378488  1             2065           2076             11               1
0           0605161 8378488  1             2079           2082              3               1

然后我需要此返回:

ClientID    AcctNbr TransID  InventoryID   TotalPendDays    Key
0           0605161 8378488  1             14               1

如果我有这样的东西:

ClientID    AcctNbr TransID  InventoryID   OpenDayNumber  CloseDayNumber   TotalPendDays    Key
0           0605161 8378488  1             2065           2076             11               1
0           0605161 8378488  1             2069           2074              5               1

然后我需要此返回:

ClientID    AcctNbr TransID  InventoryID   TotalPendDays    Key
0           0605161 8378488  1             11               1

在后一种情况下,第二条记录的整个部分都会与第一条记录的部分重叠,因此根本不需要对它进行计数。

我认为这说明了所有可能性。当然,如果第二条记录完全发生在第一条记录之前或部分发生在第二条记录之前,则需要考虑相同的问题。或者,如果返回了3条或更多条记录。基本上,无论何时发生,都需要考虑任何重叠。或者,换句话说,我需要等待多少个不同天。

1 个答案:

答案 0 :(得分:0)

对不起,这是一个非常复杂的问题,所以我不会完全回答。如果pends的数量有限,并且没有潜在的无限性,或者您仅使用VBA解决方案,答案可能会更加简单。

让我们从限制问题开始(对不起,您必须做一些调整才能使用它):我将提供针对特定TransID的代码,并提供天数。

我还将分两个步骤进行操作:

查询1:

SELECT base.AcctNbr, base.TransID, tblBusinessDays.DayNumber
FROM (SELECT DISTINCT AcctNbr, TransID FROM tblPends) base
INNER JOIN tblPends sub ON base.AcctNbr = sub.AcctNbr
    AND base.TransID  = sub.TransID)
INNER JOIN tblBusinessDays ON (tblBusinessDays.[Date] <= sub.PendOpenDT  AND tblBusinessDays.[Date] >= sub.PendCloseDT

此查询将返回给定的AcctNbr和TransID的所有可能的工作日编号(我假设这些是将这些标记相互关联的不同条目)。

然后,我们要做的就是COUNT(Distinct)。不幸的是,Access不支持该功能,因此我们必须分两步进行:

Query2:

SELECT AcctNbr, TransID,  Count(DayNumber)
FROM (SELECT DISTINCT * FROM Query1) q
GROUP BY AcctNbr, TransID

Query2将包含您要查找的内容,以及在开始和结束日期之内的不同日期ID。