快速汇总多个动态声明的变量

时间:2019-10-16 10:02:21

标签: sql sql-server

我正在开发一个程序,其中有多个列需要向最终用户显示总和。这些列在表ColumnTest中的ColumnNames列中分配,并且用户可以更改其名称。因此,我需要在ColumnTest \ ColumnNames中查找所有列名称,然后再对outputtable中与这些列名称有关的所有值求和。

我以前使用过此脚本,在该脚本中,我在@cols中获得了所有列名,例如[col1]。[col2]。[col3],依此类推,但是当我尝试运行查询时,我无法求和这些列使用'+ @cols +'。运行此命令时,出现以下错误:SUM函数需要1个参数。是否有可行的方法来执行此过程,而又不会大幅降低加载时​​间?

DECLARE 
    @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SELECT @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.ColumnNames) 
            FROM ColumnTest c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') ,1,1,'')

set @query = 
    '
    SELECT
        ID
        ,SUM('+ @cols + ')
    FROM Output_table
    GROUP BY
        ID
        '
execute(@query);

2 个答案:

答案 0 :(得分:1)

尝试一下

DECLARE 
    @cols AS NVARCHAR(MAX)='',
    @query  AS NVARCHAR(MAX);

SELECT @cols += 'SUM('+ColumnNames+') as ['+ColumnNames+'],'
from
(
    SELECT distinct ColumnNames FROM ColumnTest
)A

SELECT @cols=LEFT(@cols,LEN(@cols)-1)

set @query = 
    '
    SELECT ID,'+ @cols + '
    FROM Output_table
    GROUP BY ID
    '
execute(@query);

或者如果要添加所有列值,可以在查询下面使用

DECLARE @cols AS NVARCHAR(MAX)='',
        @query  AS NVARCHAR(MAX);

SELECT @cols += ''+ColumnNames+'+'
FROM
(
    SELECT DISTINCT ColumnNames FROM ColumnTest
)A

SELECT @cols=LEFT(@cols,LEN(@cols)-1)

set @query = 
    '
    SELECT ID,SUM('+ @cols + ')
    FROM Output_table
    GROUP BY ID
    '
execute(@query);

答案 1 :(得分:0)

您不能使用逗号分隔,例如“,” 您可以使用“ +”

尝试一下

DECLARE 
    @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SELECT @cols = STUFF((SELECT distinct '+' + QUOTENAME(c.ColumnNames) 
            FROM ColumnTest c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') ,1,1,'')

set @query = 
    '
    SELECT
        ID
        ,SUM('+ @cols + ')
    FROM Output_table
    GROUP BY
        ID
        '
execute(@query);