2016-06-13 90 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