sql 服务器 2012 动态列总和

sql sever 2012 sum of dynamic columns

假设我有一个包含 50 列的 table,名称为 AMT_0AMT_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)