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'
我有一个代码可以正常工作。我只想修改一行,但我不知道该怎么做,甚至不知道该怎么做。
代码如下
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'