2012-02-09 8 views
1

私は日々変化し、製品の価格を持つテーブルを持って列に参加し、言うことができますTSQLは異なる値

価格(のproductIDはint、価格フロート、dateprice日時)。

これらの価格は週末には存在しないため、テーブルにはすべての日の価格がありません。

productId、day、todayPrice、yesterdayPriceの結果が欲しいです(前日がないため、最初の日付は明らかにこの結果に表示されません)。このような参加は、私が欲しいものを私に与えるだろうと思ったが、うまくいかなかった。

select p1.productId, p1.dateprice, p1.price, p2.price 
from price p1 
inner join price pr ON pr.productId = p1.productId 
inner join price p2 ON p1.dateprice = (select max (p.dateprice) 
             from price p 
             where p.dateprice < p1.dateprice) 

この選択復帰空の結果が、私は「=」の代わりに使用している場合は(予想通り)「<は、」それは私に多くの同じ行を持つテーブルを返します。

この情報を選択するにはどうすればよいですか?

+0

あなたは 'あなた' on'の句にp2'を参照していませんでした。 – HABO

+0

編集後...私は 'pr'が何をするのか分かりません。なぜ 'p1'から' pr'に参加するのですか? –

答えて

1

あなたは近くにいましたが、ある商品の価格を前の価格に加算する場合は、商品IDを含めることを確認してください。そうでなければ、他の商品の価格。

また、p2が前日の価格の場合... max (p.dateprice)p1.dateprice未満であることを確認する日付です。

select 
    p1.productId, p1.dateprice, 
    p1.price as todayPrice, p2.price as yesterdayPrice 
from price p1 
inner join price p2 
    on p1.productId = p2.productId 
    and p2.dateprice = (
     select max (p.dateprice) 
     from price p 
     where 
      p.dateprice < p1.dateprice 
      and p.productId = p1.productId 
    ) 
+0

ありがとう、仲間が、私は最初のON条件、productIdを投稿するのを忘れていました。それは私の元のクエリでしたが、これも、クエリはまだ動作しません。私は元の投稿を編集しました。 – user1200835

1

あなたはちょうどこのように、あなたの参加条件を変更、右のトラックにあります、あなたのdatepriceすでに切り捨てられた日付時刻を想定し、日時を切り捨てるために使用される

select p1.productId, p1.dateprice, p1.price, p2.price 
from price p1 
inner join price p2 ON p1.productId = p2.productId AND p1.dateprice = DATEADD(day, -1, p2.dateprice) AND p2.dateprice = CONVERT(VARCHAR, GETDATE()) 

GETDATE()CONVERTをすることを時間は午前12時です。そうでない場合は、CONVERTを使用する必要があります。あなたの代わりに最新のものを取得するにはMAX()を使用する場合は、CROSS APPLYを使用したほうが良いです:

select p1.productId, p1.dateprice, p1.price, p2.price 
    from price p1 
    CROSS APPLY (select TOP 1 p.price 
FROM price p WHERE p.productId = p1.productId ORDER BY p.dateprice DESC) p2