MS-Access Получить цену товара на определенную дату заказа

У меня есть таблица, заполненная закупочными ценами, например:

sku                   price    btw   startdate
PCR-CA5425023181515   21,17 €   1    01/01/2009
PCR-CA5425023181515  999,00 €   1    06/06/2009
PCR-CA5425023181515  444,00 €   4    09/07/2009
PCR-CA5425023181515  100,00 €   4    10/08/2009

У меня есть еще одна таблица, заполненная заказами, например:

sku                  quantity   orderdate
PCR-CA5425023181515     5       01/05/2009
PCR-CA5425023181515    10       01/12/2009
PCR-CA5425023181515    10       24/12/2009

Моя цель - получить каждую цену покупки за заказ с этой даты. (Например: когда я заказал товар 1 мая (01/05), он стоил 21,17 евро. Когда я заказал его 1 декабря (01/12), он стоил 100,00 евро.)

Я боролся с этим в течение последнего часа, но пока не нашел ничего полезного.


person skerit    schedule 13.01.2010    source источник


Ответы (1)


SELECT
     O.sku,
     O.qty,
     PP.price
FROM
     Orders O
INNER JOIN Purchase_Prices PP ON
     PP.sku = O.sku AND
     PP.start_date <= O.order_date
WHERE
     NOT EXISTS
     (
          SELECT
               *
          FROM
                Purchase_Prices PP2
          WHERE
                PP2.sku = PP.sku AND
                PP2.start_date <= O.order_date AND
                PP2.start_date > PP.start_date
     )

В качестве альтернативы:

SELECT
     O.sku,
     O.qty,
     PP.price
FROM
     Orders O
INNER JOIN Purchase_Prices PP ON
     PP.sku = O.sku AND
     PP.start_date <= O.order_date
LEFT OUTER JOIN Purchase_Prices PP2 ON
     PP2.sku = O.sku AND
     PP2.start_date <= O.order_date AND
     PP2.start_date > PP.start_date
WHERE
     PP2.sku IS NULL
person Tom H    schedule 13.01.2010
comment
Это точно! Первый, с подзапросом, работает как шарм. Я также пробовал что-то с WHERE EXISTS, но у меня было несколько подзапросов. Это не сработало. Однако второй не сработал. Access пожаловался на отсутствие операторов. (что явно не соответствует действительности) - person skerit; 13.01.2010
comment
Остерегайтесь, потому что подзапросы с NOT не оптимизированы в Jet/ACE и не всегда используют индексы с обеих сторон критерия. NOT EXISTS в этом отношении еще хуже, чем NOT IN, который использует оба индекса большую часть времени. Случаи, когда он не работает, не совсем предсказуемы, и, поскольку он может иметь какое-то отношение к метаданным, подзапрос НЕ, который сегодня не является свиньей производительности, может быть таковым при некоторых других обстоятельствах, например, после того, как задействовано больше записей. - person David-W-Fenton; 14.01.2010