2013-04-08 18 views
2

我構建了一個MS Access數據庫,用於調查以創建自定義報告。所使用的調查申請並沒有給我們提供我們需要的報告。我通常會抓取數據(excel)並將其導入訪問並按照我們需要的方式生成報告。查詢 - 如果多個記錄ID#(非主鍵)匹配,請使用更晚的日期或更大的主鍵

這是第一次,我們讓人們重做調查,因爲他們正在更新某些東西,或者他們忘了添加一些東西。我需要能夠獲取最新的調查數據,以便我們在運行報告時不會重複。 (我的主要報告是由幾個子報表的一些子報表不會,如果空可見,並沒有回答是隱藏的,有任何疑問收縮,以防止不必要的空格笨重的報告。)

record ID (PK) | FName | LName | IDNum | Completed 
    1   | Bob  | Smith | 57  | 3/31/2013 5:00pm 
    2   | Bob  | Smith | 57  | 3/31/2013 7:00pm 

我想記錄ID 2或一個在晚上7點完成。

查詢和報告已經完成,所以我一直在試圖找到一種方法來在我的查詢的條件行中添加一行代碼,以便在IDnum與多個記錄匹配時獲取最近的記錄。

我一直在試圖找到最好的方法來做它在過去的幾個小時。我不認爲把數據表修改成'table without duplicates',因爲在數據庫完成之後,有些技術人員會使用它。他們所要做的就是導入一個新的excel文件來覆蓋表格,並且查詢會做所有事情來構建報表。我不想手動刪除重複的記錄。

我知道我需要做沿東西線與

IIF(count(IDNum)>1, *something, *something) 

*我卡住的真假一部分。我如何告訴訪問者需要再次在表中檢查以找到具有較大主鍵的記錄?

我以爲這會很容易,但我想我錯了。大聲笑

我在MS Access是相當新的,所以我知道我沒有使用全部的潛力,我可能會在這個角度錯誤。任何意見將不勝感激。
我是一名進入Info Systems的學生,所以我很想學習如何做到這一點。

回答

2

我相信你正在尋找的查詢

SELECT t1.* 
FROM YourTable t1 INNER JOIN 
    (SELECT IDNum, MAX(Completed) AS MaxOfCompleted 
    FROM YourTable GROUP BY IDNum 
    ) t2 
ON t1.IDNum = t2.IDNum AND t1.Completed = t2.MaxOfCompleted; 
+0

這正是我所需要的。沒有意識到我可以在訪問中指定我的桌子。有道理,因爲它是SQL。感謝一堆 – 2013-04-09 18:33:09

0

當你如果函數應該是IIF當且僅當不使用。

+0

這是一個錯字,謝謝指出。 – 2013-04-08 19:11:55

0

我推薦一個相關子查詢,如下列:

SELECT 
Data.RecordID 
, Data.FName 
, Data.LName 
, Data.IDNum 
, Data.Completed 

FROM 
Data 

WHERE 
Data.Completed IN 

(
SELECT TOP 1 
DataSQ.Completed 
FROM 
Data as DataSQ 

WHERE 
DataSQ.IDNum = Data.IDNum 

GROUP BY 
DataSQ.Completed 

ORDER BY 
DataSQ.Completed DESC 
) 

GROUP BY 
Data.RecordID 
, Data.FName 
, Data.LName 
, Data.IDNum 
, Data.Completed 

; 

說明

而不是使用功能,如Max或IIF,你可以嵌入內的另一個SELECT查詢主要查詢的WHERE子句。嵌套查詢用於確定每個IDNum的最近完成日期。不同於使用SELECT TOP 1 + ORDER BY直接從表中選擇最近一次調查,該查詢只返回一條記錄,嵌套查詢中的WHERE子句返回主查詢併爲每個IDNum生成一個結果。這被稱爲「每組最多N個」模式,並且我發現它非常有用。請注意,在嵌套查詢中,您需要使用表名稱別名,以便Access能夠區分這兩個查詢。

此外,我通常會建議不要嘗試使用表PK來執行排序。有很多情況下,PK訂單價值不能很好地指示相關領域的價值。

此代碼在虛擬數據上測試時運行良好 - 祝您好運!