2014-10-14 3 views
2

У меня есть таблица, которая содержит моментальный снимок с указанием момента времени:Обновление MS Access SQL в последовательности

| Cust # | Последняя транс. | Заряд | Количество |

Каждый месяц я получаю файл от третьего лица с транзакциями, которые будут добавлять новый cust # или изменять существующую информацию о клиенте. У меня проблемы, когда в один месяц есть несколько обновлений для одного и того же Cust #.

Например:

обработки следующий файл транзакций:

transactions

должен уступить следующий снимок таблицы:

snapshot

Это не может быть лучшим способом, но теперь у меня есть 3 отдельных запроса для обработки NEW, CHANGE и CANCEL. Нет проблем с NEW и CANCEL.

Вот как мой CHANGE запрос устанавливается:

UPDATE snp 
INNER JOIN tr 
ON snp.[Cust#] = tr.[Cust#] 

SET 
    snp.[Last Trans] = tr.Transaction, 
    snp.Charge = snp.Charge + tr.Charge, 
    snp.Quantity = tr.Quantity 

WHERE tr.Trans='CHANGE' 

Обратите внимание, что зарядка является инкрементный и количество не является. Обновление Charge работает так, как ожидалось, но Quantity is not. Я не обязательно получаю последнее количество.

Как я могу гарантировать, что если есть какие-либо изменения для одного клиента, то последнее поле Количество взято из последней строки CHANGE (т.е. максимального идентификатора этого cust #)?

ответ

1
SELECT * FROM snp 
WHERE ID IN (SELECT MAX(ID) 
      FROM tr 
      GROUP BY CUST#) 

Внутренний запрос даст вам максимальный ID всех клиентов. Вы можете отфильтровать cust # на основе ваших критериев изменения. Внешний запрос предоставит вам все детали этой строки. Затем вы можете использовать эти значения в своих запросах.