Доброе утро!
Возникла такая проблема.
Есть таблица История цен (RetailItemPriceHistory), в которой записывается розничная цена при каждом ее изменении. То есть история ведется не на каждый день, а только на те дни, когда произошло изменение цены. И вот возникает проблема поиска вот этой цены по определенной выборке.
Пример: допустим надо найти минимальную цену за период с 05.01.2011 по 20.02.2011 по конкретному товару.
В таблице есть только 3 строки с разными датами по этому артикулу (есть еще склад, но его опустим):
itemid transdate price
000001 01.01.2011 100
000001 07.01.2011 110
000001 15.02.2011 105
Делаем выборку таким образом:
X++:
select minOf(NewPrice) from RetailItemPriceHistory
where RetailItemPriceHistory.ItemId == itemId
&& RetailItemPriceHistory.InventLocationId == InventLocationId
&& RetailItemPriceHistory.TransDate >= "05.01.2011"
&& RetailItemPriceHistory.TransDate <= "20.02.2011"
&& RetailItemPriceHistory.NewPrice;
Этот запрос вернет нам цену
105.
А правильная цена за этот период
является 100, т.к. период указан начиная с 05.01.2011 и цена действовала в тот момент получается с 01.01.2011 по 07.01.2011
равной 100.
Подскажите как учесть эту цену?
У меня возникли 2 идеи по поводу решения этой задачи:
1. Написать метод, кот. будет возвращать мин. цену следующим образом:
Первый запрос будет таким, который представлен выше (Находим 1-ю мин.цену).
Второй запрос:
X++:
select firstonly RetailItemPriceHistory
order by RecId
where RetailItemPriceHistory.ItemId == itemId
&& RetailItemPriceHistory.InventLocationId == InventLocationId
&& RetailItemPriceHistory.TransDate >= "05.01.2011"
&& RetailItemPriceHistory.TransDate <= "20.02.2011"
&& RetailItemPriceHistory.NewPrice;
Находим первую строку в истории по заданным условиям. То есть вот эту строку:
itemid transdate price
000001 07.01.2011 110
Третий запрос:
Находим 2-ю минимальную цену след.образом:
X++:
select firstonly RetailItemPriceHistory2
order by RecId
where RetailItemPriceHistory2.ItemId == RetailItemPriceHistory itemId
&& RetailItemPriceHistory2.InventLocationId == RetailItemPriceHistory.InventLocationId
&& RetailItemPriceHistory2.RecId < RetailItemPriceHistory.RecId
&& RetailItemPriceHistory2.NewPrice;
И потом уже сравниваем эти 2 получившиеся цены на мин.
Выглядит уже очень коряво, посему и пишу вам =)
(Знаю что с датами запросы не отработают, поставил для наглядности)
2-й способ:
Прикрутить таблицу с датами к истории и после найти мин.цену (В SQL вижу как сделать, а в аскапте пока думаю..)
Спасибо!