2009-06-29 3 views
2

У меня возникла проблема получить право «Цена» для продукта на основе даты эффективности.Получить правильную цену, основанную на эффективности Дата

Пример: у меня есть 2 стола:

a. Таблица «Транзакция» -> содержит продукты, заказанные, и
b. «Пункт Мастер» таблица -> это содержит цены на продукцию и Effectivity дату этих цен

Внутри таблицы : операций Устанавливаются

 
INVOICE_NO INVOICE_DATE PRODUCT_PKG_CODE PRODUCT_PKG_ITEM 
1234   6/29/2009  ProductA   ProductA-01 
1234   6/29/2009  ProductA   ProductA-02 
1234   6/29/2009  ProductA   ProductA-03

Inside the "Item_Master" table: PRODUCT_PKG_CODE PRODUCT_PKG_ITEM PRODUCT_ITEM_PRICE EFFECTIVITY_DATE ProductA ProductA-01 25 6/1/2009 ProductA ProductA-02 22 6/1/2009 ProductA ProductA-03 20 6/1/2009 ProductA ProductA-01 15 5/1/2009 ProductA ProductA-02 12 5/1/2009 ProductA ProductA-03 10 5/1/2009 ProductA ProductA-01 19 4/1/2009 ProductA ProductA-02 17 4/1/2009 ProductA ProductA-03 15 4/1/2009

In my report, I need to display the Invoices and Orders, as well as the Price of the Order Item which was effective at the time it was paid (Invoice Date). My query looks like this (my source db is Oracle):

SELECT T.INVOICE_NO, T.INVOICE_DATE, T.PRODUCT_PKG_CODE, T.PRODUCT_PKG_ITEM, P.PRODUCT_ITEM_PRICE FROM TRANSACTION T, ITEM_MASTER P WHERE T.PRODUCT_PKG_CODE = P.PRODUCT_PKG_CODE AND T.PRODUCT_PKG_ITEM = P.PRODUCT_PKG_ITEM AND P.EFFECTIVITY_DATE <= T.INVOICE_DATE AND T.INVOICE_NO = '1234';

... который показывает 2 цен для каждого элемента.
Я сделал несколько других стилей запросов , но безрезультатно, поэтому я решил пришло время получить помощь. :)
Спасибо любому из вас, кто может поделиться своими знаниями. --CJ--

p.s. Извините, мой пост даже не выглядит правильным! : D

ответ

1

Аналитика - ваш друг. Вы можете использовать функцию FIRST_VALUE(), например, чтобы получить все product_item_price s для данного продукта, отсортировать по effectivity_date (по убыванию) и просто выбрать первый. Вам также потребуется DISTINCT, чтобы для каждой транзакции возвращалась только одна строка.

SELECT DISTINCT 
    T.INVOICE_NO, 
    T.INVOICE_DATE, 
    T.PRODUCT_PKG_CODE, 
    T.PRODUCT_PKG_ITEM, 
    FIRST_VALUE(P.PRODUCT_ITEM_PRICE) 
     OVER (PARTITION BY T.INVOICE_NO, T.INVOICE_DATE, 
         T.PRODUCT_PKG_CODE, T.PRODUCT_PKG_ITEM 
      ORDER BY P.EFFECTIVITY_DATE DESC) 
     as PRODUCT_ITEM_PRICE 
FROM TRANSACTION T, 
    ITEM_MASTER P  
WHERE T.PRODUCT_PKG_CODE = P.PRODUCT_PKG_CODE 
    AND T.PRODUCT_PKG_ITEM = P.PRODUCT_PKG_ITEM 
    AND P.EFFECTIVITY_DATE <= T.INVOICE_DATE 
    AND T.INVOICE_NO = '1234'; 
+0

Thanks Jeffrey! Он отлично работает! :) –

2

Если это возвращение двух строк с разными эффективными датами, которые меньше, чем на дату выставления счета, вы можете изменить ваш день присоединиться к

'AND T.INVOICE_DATE = (
select max(effectivity_date) 
from item_master 
where effectivity_date < t.invoice_date)' 

или что-то подобное, чтобы получить только одну цену который является самым последним до даты выставления счета.

1

Хотя форматирование вашего вопроса является немного слишком грязно для меня, чтобы получить все детали, он уверен, выглядит как вы ищете стандартный SQL построить ROW_NUMBER() OVER как с PARTITION и ORDER_BY - это в PostgreSql 8.4 и был в Oracle [и MS SQL Server и DB2 ...], и это самый удобный способ выбрать «верх» (или «верхний N») «по группам» и с определенным порядком чего-либо в SQL-запрос. Посмотрите это, см. here для документов, специфичных для PosgreSQL.

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