SQL 服务器:按变量限制行

SQL Server : Limit rows by variable

我有一个代码可以正常工作。我只想修改一行,但我不知道该怎么做,甚至不知道该怎么做。

代码如下

EXECUTE sp_executesql
N'SELECT [Brand],
         [month],
         cast(sum([Volume]) AS INT) as [Volume (t)],
         AVG(cast(sum([Volume])AS INT)) OVER (PARTITION BY [Brand]) AS [Average (t)],

        CASE WHEN (Row_Number() OVER (ORDER BY [month]))>@v_period
        THEN AVG(cast(sum([Volume])AS INT)) 
                    OVER (PARTITION BY [Brand] ORDER BY [month] 
                    ROWS
                    BETWEEN 3 PRECEDING AND 1 PRECEDING) 
                    ELSE NULL END 
                    AS [Moving Average]

FROM dw_lc_full_aggregated_1

WHERE   [year] = @v_year AND 
        [month] BETWEEN 1 AND 9 AND
        [Navision Source]=@v_navision_source AND
        [entry_type]=@v_entry_type AND
        [Brand]=@v_brand

GROUP BY [Brand],
         [month]',

    N'@v_period INT,
      @v_brand varchar (50),
      @v_year INT,
      @v_navision_source varchar (50),
      @v_entry_type varchar (50)',

    @v_period=3,
    @v_brand='xxxxxxxxx',
    @v_year=2016,
    @v_navision_source = 'HU',
    @v_entry_type='Country upload'

我想修改此行以使用@v_period 变量而不是“3”。

在前面 3 和前面 1 之间

我假设你已经尝试过了 在@v_period 之前和 1 之前

之间

如果失败,您可以将字符串连接成

'... Between' + CAST(@v_period as varchar(3)) + 'preceding ...'

强制转换是将整数转换为字符串。

在"execute sp_executesql"语句之前准备一个变量, 并将命令放入变量

DECLARE @v_period_Rows INT = 3
DECLARE @Cmd NVARCHAR(MAX) = 
N'SELECT [Brand],
         [month],
         cast(sum([Volume]) AS INT) as [Volume (t)],
         AVG(cast(sum([Volume])AS INT)) OVER (PARTITION BY [Brand]) AS [Average (t)],

    CASE WHEN (Row_Number() OVER (ORDER BY [month]))>@v_period
    THEN AVG(cast(sum([Volume])AS INT)) 
                OVER (PARTITION BY [Brand] ORDER BY [month] 
                ROWS
                BETWEEN '+CAST(@v_period_Rows AS NVARCHAR(10))+ ' PRECEDING AND 1 PRECEDING) 
                ELSE NULL END 
                AS [Moving Average]

     FROM dw_lc_full_aggregated_1

    WHERE   [year] = @v_year AND 
            [month] BETWEEN 1 AND 9 AND
            [Navision Source]=@v_navision_source AND
            [entry_type]=@v_entry_type AND
            [Brand]=@v_brand

  GROUP BY [Brand],
          [month]'

 EXECUTE sp_executesql
 @Cmd,
  N'@v_period INT,
    @v_brand varchar (50),
    @v_year INT,
    @v_navision_source varchar (50),
    @v_entry_type varchar (50)',

  @v_period=3,
  @v_brand='xxxxxxxxx',
  @v_year=2016,
  @v_navision_source = 'HU',
  @v_entry_type='Country upload'