Суммирование нескольких динамически объявленных переменных (быстро) - PullRequest
0 голосов
/ 16 октября 2019

Я разрабатываю программу, в которой у меня есть несколько столбцов, которые мне нужно показать сумму для конечного пользователя. Эти столбцы назначаются в таблице ColumnTest в столбце ColumnNames, и их имена могут быть изменены пользователем. Поэтому мне нужно найти все имена столбцов в ColumnTest \ ColumnNames и затем суммировать все значения, касающиеся этих имен столбцов, из выходной таблицы.

Ранее я использовал этот скрипт, где я получаю все имена столбцов в @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 ]

1 голос
/ 16 октября 2019

Попробуйте это,

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);
0 голосов
/ 16 октября 2019

Вы не можете использовать запятую как ',' Вы можете использовать '+'

Попробуйте это

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...