SQL Server 2017 - 根据订单号连接值
Posted
技术标签:
【中文标题】SQL Server 2017 - 根据订单号连接值【英文标题】:SQL Server 2017 - Concatenate values based on order number 【发布时间】:2020-04-03 19:35:32 【问题描述】:我正在对分组值大于 1 的值进行连接。这工作正常,但现在我试图弄清楚如何利用序列/顺序号来按该顺序连接值。有什么办法可以做到吗?
例如,我有一个表格,其中包含以下内容:
我需要能够连接 Field1 和 Field4,因为 StagingCol 是相同的名称,并且我还需要能够按照 ConcatenateOrder 列中提供的顺序进行连接。我不能让它乱序,即 Field4 + Field1
这是我目前运行良好的代码的 sn-p,它连接了两个 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 现在是相同的,但我想确保值的串联以正确的顺序串联。如果我要翻转上表中的 ConcatenateOrder 数字,那么结果会有所不同。 “当前”结果最终会是 CONCAT(Field1, Field4) 但“预期结果”应该是 CONCAT(Field4, Field1)
任何帮助将不胜感激。
【问题讨论】:
(1) 用您正在使用的数据库标记您的问题。 (2) 显示你想要的结果。 @GordonLinoff - (1) 这是一个自定义数据库,与此问题无关。 (2) 我更新了我的帖子。 【参考方案1】:您的代码看起来像 SQL Server。你一个用string_agg()
:
select string_agg(lzm.landingzonecol, ',') within group (order by lzm.concatenateorder)
from @LandingZoneMapping lzm
where lzm.stagingcol = 'ID';
您可以使用order by
子句控制排序。
【讨论】:
这非常适合我的需要,刚刚用我的代码完成了一些测试,它可以根据需要工作。感谢您的快速响应,非常感谢。【参考方案2】:正如 Gordon 所说,如果您使用的是 SQL Server 2017 或更高版本,则可以使用 string_agg
(Doc) 函数。
如果您需要 SQL Server 2017 以下版本的相同功能,请使用:
SELECT STUFF((
SELECT CONCAT (
','
,LandingZoneCol
)
FROM @LandingZoneMapping LZM
WHERE StagingCol = 'ID'
ORDER BY ConcatenateOrder
FOR XML PATH('')
), 1, 1, '') AS Result
【讨论】:
以上是关于SQL Server 2017 - 根据订单号连接值的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server:从多个客户的多个订单中选择最大的订单总数,并且每个订单上有多个项目