sql sever 2012 动态列的总和

问题描述

假设我有一个包含名称AMT_0,AMT_1,..AMT_49 的 50 列的表。是否有可能取决于变量的动态列数总和。

example1:SELECT SUM(AMT_0,AMT_1,AMT_2,AMT_3) FROM TBL 其中变量等于 4。

example2:SELECT SUM(AMT_0,..,AMT_23) FROM TBL 其中变量等于 24。

解决方法

理想情况下,您应该重新设计您的数据库,以便将 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)
,

您需要构建一些动态 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);