2012-04-02 24 views
1

私は、次の(簡体字)の構造を持つ2つのテーブルがあります。購入された商品要因に関するデータを保持し、これらの列を持っている検索開始日、終了日

  1. テーブル「要因」:

    をFactorSerial、PurchaseDate、PurchasedGood異なる日付

    シリアルに物価を保持している

  2. テーブル "価格"、GoodCode、 EvaluationDate、価格

価格は同じコードが異なる日付で新しい行が追加されるまで有効ですので、私は価格を追加するテーブルを作成したい、今すぐその値

を更新表1に記載されている。 我々が持っているのであれば:

PurchaseDate PurchasedGood 
----------------------------- 
    05/20/2011  A111 

と:

GoodCode EvaluationDate Price 
-------------------------------- 
    A111  02/01/2011  100 
... 
    A111  04/01/2011  110 
... 
    A111  06/01/2011  120 

を結果は

PurchaseDate PurchasedGood Price 
----------------------------------- 
    05/20/2011  A111   110 

好ましい方法は、その後

Serial GoodCode StartDate EndDate Price 

として表示Prices1を作成しているだろう因子を結合する

PurchasedDate between StartDate AND EndDate 

することで、このビューには、誰もがVIEW1(あるいは他の方法で、最終的な結果を得る)を作成する方法私を見ることができますか?前もって感謝します!

P.S.私の悪い英語を申し訳ありません!

+4

どのRDBMS(SQLServer、Oracle、MySQLなど)を使用していますか? –

答えて

0

購入日に応じてテーブル1に価格を追加するテーブルを作成します。

このようなデータを返すクエリは次のとおりです。構文はかなり標準的なSQLですが、これはSQL Server上でテストされています(あなたの "シリアル"という名前でPostgreSQLを使用しているようです)。

select a.FactorSerial, a.PurchasedGood, a.PurchaseDate 
    , (select max(Price) from Prices where GoodCode = a.PurchasedGood and EvaluationDate = a.EvaluationDate) as Price 
from (
    select f.FactorSerial, f.PurchasedGood, f.PurchaseDate, max(p.EvaluationDate) as EvaluationDate 
    from Factors as f 
     join Prices as p on f.PurchasedGood = p.GoodCode 
    where f.PurchaseDate >= p.EvaluationDate 
    group by f.FactorSerial, f.PurchasedGood, f.PurchaseDate 
) as a 

このクエリは、価格が存在する前に購入が存在しないことを前提としています。考慮また

好ましい方法は

Serial GoodCode StartDate EndDate Price 

としてビューPrices1を作成し、

PurchasedDate between StartDate AND EndDate 

betweenすることにより、このビューに因子を結合される包括的です。説明したこの方法を使用すると、PurchaseDateがある行のEndDateと別の行のStartDateにある場合、重複が発生します。

関連する問題