2016-06-13 7 views
1

У меня есть база данных с двумя таблицами, и я пытаюсь создать простой запрос, чтобы вернуть последнюю стоимость каждого элемента.Запросы MS Access для выбора последних дат

Пример:

ID, название, стоимость, дата вступления в силу

1 ... Элемент1 ... 5 ... 7/1/16

2 ... Элемент1 ... 4 ... 6/1/16

3 ... Элемент2 ... 6 ... 8/1/16

4 ... Элемент1 ... 2 ... 9/1/16

Должен возвращать только строки 3 (Item2) и 4 (последний пункт Item1).

Использование интерфейса Access, мне удалось заставить его работать, только если я не включаю стоимость вообще, и я не могу удалить стоимость из строки GROUP BY без доступа к freaking. Любая помощь приветствуется!

SQL View:

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 
         ); 

Это предполагает, что нет дубликатов даты вступления в силу для данного пункта.

EDIT:

Если у вас есть дубликаты, вы можете сделать:

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

Идентификатор - это первичный ключ, поэтому он определенно уникален. Я не совсем уверен, что вы имеете в виду; Я хочу, чтобы запрос показывал самую последнюю цену (максимальную эффективную дату) для каждого идентификатора элемента. Как можно использовать идентификатор (первичный ключ для таблицы Rate_Change) для группировки? Я попробовал ваш альтернативный код, и он получил предупреждение о том, что запрос возвращает не более одного результата. Я просто бросил Order By rc.Item_ID в конец, и он отлично работает, что я могу сказать. Спасибо за предложение! – rgdhndho

Смежные вопросы