sql 服务器 2012 动态列总和
sql sever 2012 sum of dynamic columns
假设我有一个包含 50 列的 table,名称为 AMT_0
、AMT_1
、..AMT_49
。是否有可能的动态列数总和取决于变量。
示例 1:SELECT SUM(AMT_0,AMT_1,AMT_2,AMT_3) FROM TBL
其中变量等于 4。
示例 2:SELECT SUM(AMT_0,AMT_1,..,AMT_23) FROM TBL
其中变量等于 24。
您需要构建一些动态 SQL。这样的事情应该可以解决问题
DECLARE @var smallint;
SELECT @var = 15; -- change variable value to control # of columns summed
DECLARE @sql varchar(4000);
DECLARE @cntr smallint; -- incremental counter variable for WHILE loop
SELECT @sql = '';
SELECT @cntr = 1;
WHILE @cntr > 0 AND @cntr <= 50 AND @cntr <= @var
BEGIN
IF @sql = ''
BEGIN
SELECT @sql = 'SELECT SUM(AMT_0';
END
ELSE
SQL @sql += ' + AMT_' + CONVERT(varchar(10), (@cntr-1));
END
SELECT @cntr += 1;
END
SELECT @sql += ') FROM TBL;';
EXEC (@sql);
理想情况下,你应该重新设计你的数据库,让AMT
规范化成行。那么查询就简单多了,不需要动态SQL.
目前唯一的方法是使用动态 SQL,您需要确保通过在系统表中查找所有列来检查它们是否存在,并正确引用所有列名:
DECLARE @sql nvarchar(max) = N'
SELECT SUM(
' +
(
SELECT STRING_AGG(QUOTENAME(c.name), N',')
FROM sys.columns c
WHERE c.object_id = OBJECT_ID(N'TBL')
AND c.name LIKE N'AMT_%'
) + N'
)
FROM TBL
';
EXEC (@sql)
假设我有一个包含 50 列的 table,名称为 AMT_0
、AMT_1
、..AMT_49
。是否有可能的动态列数总和取决于变量。
示例 1:SELECT SUM(AMT_0,AMT_1,AMT_2,AMT_3) FROM TBL
其中变量等于 4。
示例 2:SELECT SUM(AMT_0,AMT_1,..,AMT_23) FROM TBL
其中变量等于 24。
您需要构建一些动态 SQL。这样的事情应该可以解决问题
DECLARE @var smallint;
SELECT @var = 15; -- change variable value to control # of columns summed
DECLARE @sql varchar(4000);
DECLARE @cntr smallint; -- incremental counter variable for WHILE loop
SELECT @sql = '';
SELECT @cntr = 1;
WHILE @cntr > 0 AND @cntr <= 50 AND @cntr <= @var
BEGIN
IF @sql = ''
BEGIN
SELECT @sql = 'SELECT SUM(AMT_0';
END
ELSE
SQL @sql += ' + AMT_' + CONVERT(varchar(10), (@cntr-1));
END
SELECT @cntr += 1;
END
SELECT @sql += ') FROM TBL;';
EXEC (@sql);
理想情况下,你应该重新设计你的数据库,让AMT
规范化成行。那么查询就简单多了,不需要动态SQL.
目前唯一的方法是使用动态 SQL,您需要确保通过在系统表中查找所有列来检查它们是否存在,并正确引用所有列名:
DECLARE @sql nvarchar(max) = N'
SELECT SUM(
' +
(
SELECT STRING_AGG(QUOTENAME(c.name), N',')
FROM sys.columns c
WHERE c.object_id = OBJECT_ID(N'TBL')
AND c.name LIKE N'AMT_%'
) + N'
)
FROM TBL
';
EXEC (@sql)