2016-08-30 66 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]; 

注意:這是很多嵌套查詢和可怕的總結。如果您正在處理大數據集,那麼它最多可能會很慢,或者最糟糕的情況是數據庫超大。您可能必須將結果拆分爲實際表格,而不是嵌套子查詢。如果它是用於提供交互式工具的,我會找到一種方法來在收集數據時標記正確的記錄,而不是回顧性地進行處理。