WHERE子句中的T-SQL CASE

时间:2011-08-11 19:57:40

标签: tsql

我有一个表值函数,它返回一个包含5列的表,这些列按Sales DESC排序。

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)。

任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:4)

您可以使用row_number按销售数对每一行进行编号,并使用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