我有一些数据可能需要重叠的日期进行了分组。首先,让我解释一下表格:
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条或更多条记录。基本上,无论何时发生,都需要考虑任何重叠。或者,换句话说,我需要等待多少个不同天。
答案 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。