SQL Server 2017 - 根据订单号连接值
SQL Server 2017 - Concatenate values based on order number
我正在对分组值大于 1 的值进行串联。这工作正常,但现在我想弄清楚如何利用 sequence/order 数字来串联其中的值命令。我有办法做到这一点吗?
例如,我有一个 table,其中包含以下内容:
我需要连接 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)
虽然 Current 和 Expected 现在是相同的,但我想确保值的串联以正确的顺序串联。如果我要翻转上面 table 中的 ConcatenateOrder 数字,那么结果会有所不同。 "Current" 结果最终会是 CONCAT(Field1, Field4) 但 "Expected Results" 应该是 CONCAT(Field4, Field1)
如有任何帮助,我们将不胜感激。
您的代码看起来像 SQL 服务器。你使用 string_agg()
:
select string_agg(lzm.landingzonecol, ',') within group (order by lzm.concatenateorder)
from @LandingZoneMapping lzm
where lzm.stagingcol = 'ID';
您可以使用 order by
子句控制顺序。
如 Gordon 所述,如果您使用 SQL 服务器版本 2017 或更高版本,您可以使用 string_agg
(Doc) 函数。
如果您需要 SQL 2017 以下服务器版本的相同功能,请使用:
SELECT STUFF((
SELECT CONCAT (
','
,LandingZoneCol
)
FROM @LandingZoneMapping LZM
WHERE StagingCol = 'ID'
ORDER BY ConcatenateOrder
FOR XML PATH('')
), 1, 1, '') AS Result
我正在对分组值大于 1 的值进行串联。这工作正常,但现在我想弄清楚如何利用 sequence/order 数字来串联其中的值命令。我有办法做到这一点吗?
例如,我有一个 table,其中包含以下内容:
我需要连接 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)
虽然 Current 和 Expected 现在是相同的,但我想确保值的串联以正确的顺序串联。如果我要翻转上面 table 中的 ConcatenateOrder 数字,那么结果会有所不同。 "Current" 结果最终会是 CONCAT(Field1, Field4) 但 "Expected Results" 应该是 CONCAT(Field4, Field1)
如有任何帮助,我们将不胜感激。
您的代码看起来像 SQL 服务器。你使用 string_agg()
:
select string_agg(lzm.landingzonecol, ',') within group (order by lzm.concatenateorder)
from @LandingZoneMapping lzm
where lzm.stagingcol = 'ID';
您可以使用 order by
子句控制顺序。
如 Gordon 所述,如果您使用 SQL 服务器版本 2017 或更高版本,您可以使用 string_agg
(Doc) 函数。
如果您需要 SQL 2017 以下服务器版本的相同功能,请使用:
SELECT STUFF((
SELECT CONCAT (
','
,LandingZoneCol
)
FROM @LandingZoneMapping LZM
WHERE StagingCol = 'ID'
ORDER BY ConcatenateOrder
FOR XML PATH('')
), 1, 1, '') AS Result