2009-06-29 66 views
2

對於基於有效日期的產品獲取正確的「價格」,我有個問題。根據有效日期得到正確的價格日期

例如,我有2個表格:

a。 「交易」表 - >這包含訂購的產品,並且
b。 「項目主文件」表 - >這包含了產品價格和那些價格的有效日期

裏面的Trasaction表:

 
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,按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

謝謝Jeffrey!它完美的工作! :) – 2009-07-15 09:27:23

2

如果它返回兩行與小於發票日期,您可能需要更改日期加盟

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

或類似的東西,不同的生效日期只能得到一個價這是發票日期前的最近一次。

1

雖然你的問題的格式是有點太亂了,我讓所有的細節,它肯定看起來像你正在尋找標準的SQL構造ROW_NUMBER() OVERPARTITIONORDER_BY - 這是在PostgreSQL 8.4和已在Oracle [以及MS SQL Server中,DB2和...]中保存了很長一段時間,並且這是按羣組選擇「頂級」(或「頂級N」)以及按某種順序一個SQL查詢。查看它,查看here PosgreSQL特定的文檔。