根据有效日期获得正确的价格

时间:2009-06-29 05:01:13

标签: plsql

基于生效日期,我在为产品获得正确的“价格”时遇到问题。

示例,我有2个表:

一个。 “交易”表 - >这包含订购的产品,和 湾“物品主”表 - >这包含这些价格的产品价格和有效日期

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

3 个答案:

答案 0 :(得分:2)

如果它返回的两行的有效日期不同于发票日期,您可能希望将日期联接更改为

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

或类似的东西,只能获得发票日期之前最近的一个价格。

答案 1 :(得分:1)

虽然你的问题的格式对我来说有点太混乱以获取所有细节,但确实看起来你正在寻找标准的SQL构造ROW_NUMBER() OVER同时具有PARTITION和{{1它位于PostgreSql 8.4中,并且已经在Oracle [和MS SQL Server以及DB2 ...]中使用了很长一段时间,并且它是选择“顶部”(或“顶部N”)的最方便的方法。按组“和SQL查询中的任何顺序。查阅,有关PosgreSQL特定的文档,请参阅here

答案 2 :(得分:1)

Analytics是您的朋友。例如,您可以使用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';