2009-06-29 10 views
2

有効期間の日付に基づいて製品に適切な「価格」を得ることに問題があります。有効期間に基づいて正しい価格を取得

例:私は2つのテーブル:

を持っています。 "取引"テーブル - >これには注文された商品が含まれ、
b。各項目の2つの価格を示して

 
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';

...: - 「品目マスター」テーブルには、>これは、製品の価格と、それらの価格の有効日付Trasactionテーブル内

が含まれています。
私は他のいくつかの異なるクエリスタイルを行ったが、役に立たなかったので、私は を手伝ってください。 :)
あなたの知識を共有することができますあなたのいずれかのおかげで。 -CJ-

p.s.申し訳ありませんが、私の投稿は正しく見えません! :それは請求書の日付よりも少ない異なる有効日付を持つ2つの行を返すかどうD

答えて

1

Analyticsはあなたの友人です。たとえば、FIRST_VALUE()関数を使用して、特定の製品のproduct_item_priceをすべて取得し、effectivity_date(降順)でソートし、最初のものを選ぶだけです。トランザクションごとに1つの行だけが返されるように、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!それは完全に動作します! :) –

2

、あなただけの1つの価格を取得するには、

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

またはそのような何かに参加し、あなたの日付を変更することもできます請求書日付の前の最新のものです。

1

私はすべての詳細を取得するためにあなたの質問のフォーマットは、少しも厄介ですが、あなたが両方PARTITIONORDER_BYROW_NUMBER() OVERを構築し、標準SQLを探しているように、それは確かに見えるん - それは、PostgreSQL 8.4でだとされていますOracle [とMS SQL ServerもDB2も...]かなり長い間、 "トップ"(または "トップN")を "グループで"選択し、 SQLクエリ探します。PosgreSQL固有のドキュメントについては、hereを参照してください。

関連する問題