2016-06-13 115 views
1

我有一個數據庫與2表,我試圖建立一個簡單的查詢,以返回每個項目的最新成本。MS Access查詢只選擇最新日期

樣品:

ID,名稱,成本,生效日期

1 ... ...的Item1 5 ... 16年7月1日

2 ...項目1 ... 4 ... 16年6月1日

3 ... ...項目2 6 ... 16年8月1日

4 ...的Item1 ... 2 ... 9/1/16

應僅返回第3行(第2項)和第4項(第1項的最新)。

使用Access接口,我設法讓它工作,只要我根本不包含成本,並且我無法從沒有Access的GROUP BY行中刪除成本。任何幫助表示讚賞!

SQL視圖:

SELECT Item.Item_ID, Item.Item_Name, Rate_Changes.Cost, Max(Rate_Changes.Effective_Date) As MaxOfEffective_Date 
FROM Item INNER JOIN Rate_Changes ON Item.Item_ID = Rate_Changes.Item_ID 
WHERE Item.Active=True 
GROUP BY Item.Item_ID, Item.Active, Item.Item_Name, 
Rate_Changes.Cost, Rate_Changes.Effective_Date 

回答

1

這裏有一個方法:

SELECT i.Item_ID, i.Item_Name, rc.Cost, rc.Effective_Date 
FROM Item as i INNER JOIN 
    Rate_Changes as rc 
    ON i.Item_ID = rc.Item_ID 
WHERE i.Active = True AND 
     rc.Effective_Date = (SELECT MAX(rc2.Effective_Date) 
          FROM Rate_Changes as rc2 
          WHERE rc2.Item_Id = i.Item_id 
         ); 

這是假定沒有重複的生效日期爲給定的項目。

編輯:

如果您有重複的,你可以這樣做:

SELECT i.Item_ID, i.Item_Name, rc.Cost, rc.Effective_Date 
FROM Item as i INNER JOIN 
    Rate_Changes as rc 
    ON i.Item_ID = rc.Item_ID 
WHERE i.Active = True AND 
     rc.Effective_Date = (SELECT TOP 1 rc2.Effective_Date 
          FROM Rate_Changes as rc2 
          WHERE rc2.Item_Id = i.Item_id 
          ORDER BY rc2.Effective_Date DESC, rc2.id DESC 
         ); 
+0

,從我有限的樣本數據的正常工作,謝謝!我非常肯定,對於一個給定的項目,永遠不應該有重複的生效日期 - 有什麼方法可以強制執行?我幾乎全新接入,所以我仍然在摸索命令。 – rgdhndho

+0

@rgdhndho。 。 。如果'id'與日期一起增加,則可以使用'id'而不是'effective_date'。 –

+0

ID是主鍵,所以它絕對是唯一的。我不太清楚你的意思,我想讓查詢顯示每個商品ID的最新價格(最大生效日期)。如何使用ID(Rate_Change表的主鍵)進行分組?我試過了你的另一個代碼,它最終發出一條警告,說查詢最多隻返回一個結果。我只是投擲Order By rc.Item_ID到最後,而且從我所知道的情況來看它工作正常。感謝您的建議! – rgdhndho