2017-04-17 22 views
0

からトップ2レコードを選択します。私は3つのテーブル持っている各カテゴリー

  • 製品:ID、名前
  • ProductPrices:ID、のProductId、PriceListId、バリュー、AddDateTime
  • 価格表:ID、タイトル

私は今、私がSEにしたいのProductIdとPriceListId

でProductPricesの各製品に複数の値を追加することができますプロダクトIDを持つProductPricesからすべてを選択しますが、現在の製品の各価格表の上位2つの値を選択します。

どうすればいいですか?

私はこのコードを書いた:しかし、それは価格

Select PR.PriceListId, PL.Title, PR.id, PR.ProductId, PR.Value, PR.AddDateTime 
From Products FL left outer join 
    ProductPrices PR 
    on PR.ProductId = FL.id left outer join 
    PriceLists PL 
    on PR.PriceListId = PL.id 
group by PR.id , PR.ProductId, PR.Price, PR.AddDateTime, PL.Title , PR.PriceListId 
order by Pr.PriceListId 

EDITのすべて返す:

Products: 
    id Name 
    1 Product1 
    2 Product2 

    ProductPrices: 
    id ProductId PriceListId Value AddDateTime 
    1  1   1    XXX  Today 
    2  1   1    XXX  YesterDay 
    3  1   1    XXX  Older than yesterday 
    4  1   2    XXX  Today 
    5  1   3    XXX  Today 
    6  1   3    XXX  Today 
    7  1   3    XXX  YesterDay 
    9  2   1    XXX  YesterDay 
    11 2   2    XXX  Today 
    12 2   3    XXX  Today 
    13 2   3    XXX  Today 
    14 2   3    XXX  YesterDay 

    PriceLists: 
    id  Title 
    1  X 
    2  Y 
    3  Z 

Result from ProductPrices By id should be: 

id ProductId PriceListId Value AddDateTime 
1  1   1    XXX  Today 
2  1   1    XXX  YesterDay 
4  1   2    XXX  Today 
5  1   3    XXX  Today 
6  1   3    XXX  Today 
9  2   1    XXX  YesterDay 
11 2   2    XXX  Today 
12 2   3    XXX  Today 
13 2   3    XXX  Today 
+1

使用しているデータベースで質問にタグを付けてください。 –

+0

そのSql Server 2014 –

答えて

0

をこれは、あなたが項目ごとに2つの最高の価格をしたいと仮定すると、動作するはずです。最も低い値にするには、row_number関数で "order by value asc"に変更します。

Select PR.PriceListId, PL.Title, PR.id, PR.ProductId, PR.Value, PR.AddDateTime 
From Products FL 
left outer join (select * from (
       select *, row_number() over (order by AddDateTime desc) as row_num 
       from ProductPrices) 
       where row_num <= 2) PR 
on PR.ProductId = FL.id 
left outer join PriceLists PL on PR.PriceListId = PL.id 
group by PR.id, PR.ProductId, PR.Value, PR.AddDateTime, PL.Title, PR.PriceListId 
order by Pr.PriceListId 
+0

修正:Pr.PriceはPr.Valueであり、動作していないとエラーが発生します。私はAddDateTimeで2つの最上位の行が必要です –

+0

@mohammadaghiliあなたのフィードバックを考慮に入れて編集しました。 –

+0

私は自分の質問を編集しました。より良い情報を追加 –

0

それは楽しみがouter applyを使用することです:私は、集計が不要になったことを推測していないのです

Select PR.PriceListId, PL.Title, PR.id, PR.ProductId, PR.Value, PR.AddDateTime 
From Products FL outer apply 
    (select top 2 PR.* 
     from ProductPrices PR 
     where PR.ProductId = FL.id 
     order by PR.value desc -- presumably you want the "top 2" by value 
    ) PL left join 
    PriceLists PL 
    on PR.PriceListId = PL.id 
order by Pr.PriceListId ; 

+0

私が望むものはこれではない、私は私の質問を編集し、新しい情報が追加されました、もう一度見てください –

関連する問題