2011-08-11 16 views
1

Sales DESCによってソートされた5つの列を持つテーブルを返すテーブル値関数があります。WHERE句のT-SQL CASE

Item.Count..Year...Month....Sales............ID 
808.........2010.....7......212282.88........1 
699.........2011.....7......179029.45........2 
829.........2007.....7......135034.52........3 
959.........2005.....7......129611.80........4 
861.........2006.....7......104667.57........5 

私がしようとしているのは、2番目に大きな販売価値を得ることです。私ができること。ただし、ビジネスロジックでは、2番目に大きな売上値の年が今年(2011年)と同じ場合、次の売上値(135034.52)を取得すると記載されています。ここで

は、私が持っているものです。

DECLARE @Sales  DECIMAL(14, 2) = 179029.45 
SELECT * 
FROM dbo.fnGetDate(181, '08-01-2011') 
WHERE ID = 
    CASE WHEN Sales = @Sales AND Year = YEAR(DATEADD(M, -1, '08-01-2011')) 
     THEN 3 ELSE 2 END 

残念ながら、これはそれが必要ように動作しません。 @Salesの値を変更すると動作します(例:179029.44)。

誰でも手助けできますか?

答えて

4

あなたが販売することにより、各列に番号を付けるrow_numberを使用し、そしてそれは今年からだ場合は2番目の行を除外するためにwhere句を使用することができます。

SELECT TOP 1 * 
FROM (
     SELECT row_number() over (order by Sales desc) as rn 
     ,  * 
     FROM dbo.fnGetDate(181, '08-01-2011') 
     ) as SubQuery 
WHERE (rn >= 2 and datepart(year, getdate()) <> SubQuery.year) 
     or rn >= 3 
ORDER BY 
     rn 
+0

トリックを行いました!ありがとうございました。 – coson