SQL Server 2017 - объединение значений на основе номера заказа - PullRequest
0 голосов
/ 03 апреля 2020

Я делаю конкатенацию значений там, где значение группировки больше 1. Это работает нормально, но сейчас я пытаюсь выяснить, как использовать номер последовательности / порядка, в котором можно объединить значения в этом порядке. Есть ли способ, которым я могу сделать это?

Так, например, у меня есть таблица, которая имеет следующее:

Table

I Мне нужна возможность объединить Field1 и Field4, так как StagingCol - это одно и то же имя, и мне также нужно иметь возможность объединять в порядке, указанном в столбце ConcatenateOrder. Я не могу иметь его вне последовательности, т.е. Field4 + Field1

Это фрагмент кода, который у меня есть, который работает нормально, он объединяет два значения LandingZoneCol ...

--DECLARATION OF LANDING ZONE FIELD NAMES CONCATENATED TOGETHER AND DELMITED BY A COMMA WHERE VALUE NEEDS TO BE CONCATENATED (I.E. SUBSCRIBER + SEQ# = MEMBER_ID)
SELECT @ConcatLandingZoneFieldNames = ISNULL(@ConcatLandingZoneFieldNames,'') + ISNULL(LandZoneMapping.LandingZoneFieldName,'') + ', '     
FROM @LandingZoneMapping AS LandZoneMapping
WHERE LandZoneMapping.StagingColumnName <> 'BreadCrumb'
AND LandZoneMapping.StagingColumnName IN (SELECT StagingColumnName
    FROM @TEST 
    WHERE Total > 1)

--DECLARATION OF VARIABLES
SET @ConcatLandingZoneFieldNames = CONCAT('CONCAT(',SUBSTRING(@ConcatLandingZoneFieldNames,1,LEN(@ConcatLandingZoneFieldNames)-1),')')

Текущие результаты CONCAT (Field1, Field4)

Ожидаемые результаты CONCAT (Field1, Field4)

Хотя Текущие и Ожидаемые в настоящее время одинаковы. Я хочу убедиться, что объединение значений происходит в правильном порядке. Если бы я перевернул числа ConcatenateOrder в приведенной выше таблице, результат был бы другим. «Текущие» результаты в конечном итоге будут CONCAT (Field1, Field4), но «Ожидаемые результаты» должны быть CONCAT (Field4, Field1)

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Ваш код выглядит как SQL Сервер. Вы используете string_agg():

select string_agg(lzm.landingzonecol, ',') within group (order by lzm.concatenateorder)
from @LandingZoneMapping lzm
where lzm.stagingcol = 'ID';

Вы можете управлять заказом с помощью предложения order by.

0 голосов
/ 03 апреля 2020

Как упомянул Гордон, вы можете использовать функцию string_agg ( Do c), если вы используете SQL Версия сервера 2017 или выше.

На случай, если вам нужно та же функциональность для SQL Версия сервера ниже 2017 года, используйте это:

SELECT STUFF((
            SELECT CONCAT (
                    ','
                    ,LandingZoneCol
                    )
            FROM @LandingZoneMapping LZM
            WHERE StagingCol = 'ID'
            ORDER BY ConcatenateOrder
            FOR XML PATH('')
            ), 1, 1, '') AS Result
...