2011-08-11 30 views
1

我有一個表值函數,該函數返回一個表格,其中有5列按銷售DESC排序。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 

我想要做的是獲得第二大銷售價值。我可以做。但是,業務邏輯規定,如果第二大銷售額的年份與當年(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通過銷售編號每一行,並使用where子句排除第2行,如果從今年的:

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