Plsql 根据生效日期获取正确的价格

Plsql 根据生效日期获取正确的价格,plsql,Plsql,我无法根据生效日期为产品确定正确的价格 例如,我有两个表: a。交易表->包含订购的产品,以及 B物料主表->包含产品价格和这些价格的生效日期 在传输表内: …显示每个项目的2个价格。 我做了一些其他不同的查询风格 但是没有用,所以我决定 是时候寻求帮助了 谢谢你们中的任何一位 分享你的知识-希杰- p、 对不起,我的帖子看起来都不对D如果返回的两行的生效日期不同,且小于发票日期,则可能需要将日期更改为“加入” 'AND T.INVOICE_DATE = ( select max(ef

我无法根据生效日期为产品确定正确的价格

例如,我有两个表:

a。交易表->包含订购的产品,以及 B物料主表->包含产品价格和这些价格的生效日期

在传输表内:

…显示每个项目的2个价格。 我做了一些其他不同的查询风格 但是没有用,所以我决定 是时候寻求帮助了 谢谢你们中的任何一位 分享你的知识-希杰-


p、 对不起,我的帖子看起来都不对D

如果返回的两行的生效日期不同,且小于发票日期,则可能需要将日期更改为“加入”

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

或者类似的,只获取发票日期前最近的一个价格。

虽然您的问题的格式有点混乱,我无法获取所有细节,它看起来确实像是在寻找标准的SQL构造行号,同时包含分区和顺序-它在PostgreSql 8.4中,并且在Oracle[以及MS SQL Server和DB2…]中已经存在了相当长的一段时间,这是按组和SQL查询中的某个特定顺序选择top或top N的最简便的方法。查找它,请参阅PosgreSQL特定文档。

分析是您的朋友。例如,您可以使用FIRST_VALUE函数获取给定产品的所有产品项目价格,按生效日期降序排序,然后只选择第一个。您还需要一个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';
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';