2009-06-29 83 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特定的文档。