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:从多个客户的多个订单中选择最大的订单总数,并且每个订单上有多个项目

SQL Server 查询以计算每日“持仓”未结订单

Oracle SQL 顺序连接数据

如何从SQL表中选择特定行并在SQL Server中连接多个表?

SQL 根据当前日期减去两天选择记录

DOCKER中sql server2017连接外部出错