how to use a variable in a CASE statement?

  • hi everyone

    I am getting an error when I add a variable to a CASE statement.  How can I fix it?

    Code:

    DECLARE @AVERAGE_LENGTH INT
    SET @AVERAGE_LENGTH = 3

    SELECT T1.SYMBOL,
    T1.TRADE_DATE,
    CASE WHEN COUNT(T1.CLOSE_PRICE) OVER (PARTITION BY T1.SYMBOL ORDER BY T1.TRADE_DATE ROWS BETWEEN @AVERAGE_LENGTH - 1 PRECEDING AND CURRENT ROW) = @AVERAGE_LENGTH
    THEN AVG(T1.CLOSE_PRICE) OVER (PARTITION BY T1.SYMBOL ORDER BY T1.TRADE_DATE ROWS BETWEEN @AVERAGE_LENGTH - 1 PRECEDING AND CURRENT ROW)
    ELSE NULL
    END AS AVERAGE
    FROM DBO.TestTable AS T1

    Error:

    Msg 156, Level 15, State 1, Line 4
    Incorrect syntax near the keyword 'as'.
    Msg 102, Level 15, State 1, Line 28
    Incorrect syntax near '@AVERAGE_LENGTH'.

    Thank you

  • You cant use a variable here

    ROWS BETWEEN @AVERAGE_LENGTH - 1 PRECEDING AND CURRENT ROW)

    You can achieve what you are attempting by using Dynamic SQL

    DECLARE @AVERAGE_LENGTH int;
    SET @AVERAGE_LENGTH = 3;

    DECLARE @SQL varchar(MAX);

    SET @SQL = '
    SELECT T1.SYMBOL
    , T1.TRADE_DATE
    , AVERAGE = CASE WHEN COUNT(T1.CLOSE_PRICE) OVER (PARTITION BY T1.SYMBOL
    ORDER BY T1.TRADE_DATE
    ROWS BETWEEN ' + CONVERT(varchar(10), @AVERAGE_LENGTH) + ' - 1 PRECEDING AND CURRENT ROW) = ' + CONVERT(varchar(10), @AVERAGE_LENGTH) + '
    THEN AVG(T1.CLOSE_PRICE) OVER (PARTITION BY T1.SYMBOL
    ORDER BY T1.TRADE_DATE
    ROWS BETWEEN ' + CONVERT(varchar(10), @AVERAGE_LENGTH) + ' - 1 PRECEDING AND CURRENT ROW)
    ELSE NULL END
    FROM DBO.TestTable AS T1;'

    --PRINT(@SQL);
    EXEC sys.sp_executesql @stmt = @SQL;

Viewing 2 posts - 1 through 2 (of 2 total)

You must be logged in to reply to this topic. Login to reply