2016-08-30 22 views
0

我在Access中有一个表格,显示员工的部门历史记录;总共有几千条记录,如果一名员工在一个以上的部门中,他/她将有多条记录。数据样本显示在附图中。 Sample Table在Access 2010中只显示部门更改查询

目标是针对Access中的查询返回关联者的转移历史记录,换句话说,他/她第一次处于每个唯一的部门代码中。附图中还显示了样本数据预期结果的一个例子。 Expected Outcome

注意,例如,第一助理(员工的Test1)有叠排的顶部在2016年7月5日,我会希望被省略,因为此前的纪录已经反映在5转移到001271 /二千〇一十六分之二。

至此,我已经创建了下面的查询中通过查询向导(我在SQL新手)访问:

SELECT DISTINCT [Multiple Records_1].[Associate ID], [Multiple Records_1].[First Name], [Multiple Records_1].[Last Name], Min([Multiple Records_1].[Position Effective Date]) AS [MinOfPosition Effective Date], [Multiple Records_1].[Home Department Code], [Multiple Records_1].[Business Unit Description] 
FROM [Multiple Records] INNER JOIN [Multiple Records] AS [Multiple Records_1] ON [Multiple Records].[Associate ID] = [Multiple Records_1].[Associate ID] 
GROUP BY [Multiple Records_1].[Associate ID], [Multiple Records_1].[First Name], [Multiple Records_1].[Last Name], [Multiple Records_1].[Home Department Code], [Multiple Records_1].[Business Unit Description], [Multiple Records].[Home Department Code] 
HAVING ((([Multiple Records].[Home Department Code])<>[Multiple Records_1].[Home Department Code])); 

这让我非常接近我所需要的,但10/5/2015“员工测试1”的记录被压制,因为他转回到001289 ......我想确保类似的记录不会因为员工转出某个部门而被转移回去。

我将不胜感激任何帮助!提前谢谢了!

回答

0

有可能解决这个更优雅的方式,但是这个工作对我来说:

首先为每个DPT的最早日期整体的总结(qryMin1)。这给出了与查询相同的结果,而无需将表加入自己。

SELECT [Multiple Records].[Associate ID], Min([Multiple Records].[Position Effective Date]) AS EarliestEffectiveDate, [Multiple Records].[Home Department Code] 
FROM [Multiple Records] 
GROUP BY [Multiple Records].[Associate ID], [Multiple Records].[Home Department Code]; 

现在得到任何其他的(最小)日期(qryMin2),这是在qryMin1的那些之后。这会给qryMin1的结果带来一些重复;现在没关系。

SELECT [Multiple Records].[Associate ID], Min([Multiple Records].[Position Effective Date]) AS OtherEarliestDates, [Multiple Records].[Home Department Code] 
FROM qryMin1 INNER JOIN [Multiple Records] ON qryMin1.[Associate ID] = [Multiple Records].[Associate ID] 
WHERE ((([Multiple Records].[Position Effective Date])>[qryMin1]![EarliestEffectiveDate]) AND (([Multiple Records].[Home Department Code])<>[qryMin1]![Home Department Code])) 
GROUP BY [Multiple Records].[Associate ID], [Multiple Records].[Home Department Code]; 

现在我们UNION两个查询结果(使用UNION不是UNION ALL,因为我们不希望重复):

SELECT [Associate ID], EarliestEffectiveDate, [Home Department Code] FROM qryMin1 
UNION SELECT [Associate ID], OtherEarliestDates, [Home Department Code] FROM qryMin2; 

最后,加入这个备份原来的表做任何你想要的结果。在这里,我用它在这个机制会保留的记录上显示一个标志,看看它是否做得正确。

SELECT [Multiple Records].[Associate ID], [Multiple Records].[First Name], [Multiple Records].[Last Name], [Multiple Records].[Position Effective Date], [Multiple Records].[Home Department Code], [Multiple Records].[Business Unit Description], IIf([qryMinUnion]![Associate ID] Is Not Null,1,Null) AS [Result?] 
FROM [Multiple Records] LEFT JOIN qryMinUnion ON ([Multiple Records].[Home Department Code] = qryMinUnion.[Home Department Code]) AND ([Multiple Records].[Position Effective Date] = qryMinUnion.EarliestEffectiveDate) AND ([Multiple Records].[Associate ID] = qryMinUnion.[Associate ID]) 
ORDER BY [Multiple Records].[Associate ID], [Multiple Records].[Position Effective Date]; 

注意:这是很多嵌套查询和可怕的总结。如果您正在处理大数据集,那么它最多可能会很慢,或者最糟糕的情况是数据库超大。您可能必须将结果拆分为实际表格,而不是嵌套子查询。如果它是用于提供交互式工具的,我会找到一种方法来在收集数据时标记正确的记录,而不是回顾性地进行处理。