仅显示Access 2010查询中的部门更改

时间:2016-08-30 21:47:03

标签: sql ms-access-2010

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

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

请注意,例如,第一个员工(员工Test1)在2016年7月5日有一个堆栈行的顶部我希望被省略,因为之前的记录已经反映了在5月2日转移到001271 2016年

到目前为止,我已经通过查询向导在Access中创建了以下查询(我是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]));

这让我非常接近我所需要的,但2015年10月5日“员工测试1”的记录被抑制了,因为他转回了001289 ...我想确保不删除类似的记录因为一个员工转出一个部门,但后来转回了它。

我非常感谢任何帮助!提前谢谢了!

1 个答案:

答案 0 :(得分: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];

现在获得qryMin1之后的任何其他(最小)日期(qryMin2)。这将带来一些与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 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];

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