Подготовить функцию SUM для заданной динамической строки - PullRequest
0 голосов
/ 13 июня 2019

Заданная строка:

Примечание : следующая строка, разделенная запятыми, является динамической и может содержать любую комбинацию.

DECLARE @Str varchar(max) = '[A-B],[B-C],[C-D],[D-E]'

Ожидаемый результат :

SUM([A-B]) AS [A-B],SUM([B-C]) AS [B-C],SUM([C-D]) AS [C-D],SUM([D-E]) AS [D-E] 

Моя попытка:

SELECT 'SUM('+REPLACE(@Str,',','),SUM(')+')' 

Выход:

SUM([A-B]),SUM([B-C]),SUM([C-D]),SUM([D-E])

Ответы [ 3 ]

2 голосов
/ 13 июня 2019

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

DECLARE @Str AS TABLE ([Str] varchar(max) )
INSERT INTO @Str
SELECT  '[A-B],[B-C],[C-D],[D-E]' 


;WITH CTE
AS
(
SELECT  'SUM( '+Split.a.value('.','nvarchar(100)')+' ) AS 'AS [Str],Split.a.value('.','nvarchar(100)') AS [Str1]

FROM
(
SELECT  CAST('<S>'+(REPLACE([Str],',','</S><S>')+'</S>') AS XML ) AS [Str]
FROM @Str
)AS A
CROSS APPLY [Str].nodes('S') AS Split(a)
)

SELECT  STUFF((SELECT DISTINCT ', '+ CONCAT([Str], [Str1])
FROM CTE 
FOR XML PATH ('')),1,1,'') AS ExpectedResult

Результат

ExpectedResult
-------------------
 SUM( [A-B] ) AS [A-B], SUM( [B-C] ) AS [B-C], SUM( [C-D] ) AS [C-D], SUM( [D-E] ) AS [D-E]
1 голос
/ 13 июня 2019

Будучи SQL Server 2008, вам сначала нужно создать функцию SplitString (она уже включена в SQL Server 2016 и более поздние версии), например:

Разделенная строка T-SQL

Тогда вы можете рассчитать свои пункты:

select 'sum(' + Name + ', as ' + Name
from SplitString(@Str)

И, наконец, вам нужно только объединить все эти строки, например, добавить путь к XML ('')

select 'sum(' + Name + ', as ' + Name + ','
from SplitString(@Str)
for xml path('')
0 голосов
/ 13 июня 2019

Простой способ достичь своей цели

    Declare @str varchar(max) = '[A-B],[B-C],[C-D],[D-E]'
        , @Main varchar(max)=''


        select  @Main += ',sum('+a+')'
         from (select distinct value as a from STRING_SPLIT(@str , ',')) as Splt 
        set @Main= stuff(@Main ,1,1,'')
        print @Main

Result : sum([A-B]),sum([B-C]),sum([C-D]),sum([D-E])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...