You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用STRING_SPLIT规范化临时表数据并关联仓格坐标与编号?

仓库仓格坐标与编号关联解决方案

问题背景

现有仓库仓格数据存储在##TempTable的BinGrid字段中,每条数据格式为(X,Y) 编号串,示例数据:

(27,1) S,S,S
(1,34) F,F,F

需要将其拆分为BinCoord(坐标)和BinNumb(编号)两列的关联表。

尝试过的方法

使用STRING_SPLIT拆分后按全局行号奇偶性拆分到两个临时表,但无法保证坐标与编号的对应关系:

INSERT INTO ##TestTemp
SELECT
s.CustomerID,
s1.[value] AS [BinInfo],
[RN] = ROW_NUMBER() OVER (ORDER BY CustomerID)
FROM ##TempTable s
CROSS APPLY STRING_SPLIT(s.[BinGrid], ' ') s1

SELECT * INTO ##CoordTemp
FROM ##TestTemp WHERE ([RN]%2)=1
SELECT * FROM ##CoordTemp

SELECT * INTO ##NameTemp
FROM ##TestTemp WHERE ([RN]%2)=0
SELECT * FROM ##NameTemp

当前拆分结果:

坐标临时表(##CoordTemp)

BinCoordRN
(27,1)1
(1,34)3

编号临时表(##NameTemp)

BinNumbRN
S,S,S2
F,F,F4

期望输出

BinCoordBinNumb
(27,1)S,S,S
(1,34)F,F,F

解决方法

方法1:直接拆分字段(兼容所有SQL Server版本)

无需拆分后关联,直接通过字符串函数拆分每条BinGrid记录:

SELECT
    CustomerID,
    -- 提取空格前的坐标部分
    LEFT(BinGrid, CHARINDEX(' ', BinGrid) - 1) AS BinCoord,
    -- 提取空格后的编号部分
    RIGHT(BinGrid, LEN(BinGrid) - CHARINDEX(' ', BinGrid)) AS BinNumb
INTO ##FinalResult
FROM ##TempTable

方法2:使用STRING_SPLIT的ordinal参数(SQL Server 2022及以上)

利用STRING_SPLIT新增的ordinal参数保留拆分顺序,直接分组提取对应值:

SELECT
    s.CustomerID,
    MAX(CASE WHEN s1.ordinal = 1 THEN s1.[value] END) AS BinCoord,
    MAX(CASE WHEN s1.ordinal = 2 THEN s1.[value] END) AS BinNumb
INTO ##FinalResult
FROM ##TempTable s
-- 第三个参数1启用ordinal返回
CROSS APPLY STRING_SPLIT(s.BinGrid, ' ', 1) s1
GROUP BY s.CustomerID, s.BinGrid

方法3:修正原拆分逻辑,按原行分组编号

如果必须保留拆分临时表的方式,需按原记录分组生成行号,而非全局行号:

-- 重新生成带分组行号的临时表
INSERT INTO ##TestTemp
SELECT
    s.CustomerID,
    s.BinGrid,
    s1.[value] AS [BinInfo],
    -- 按原记录分组生成行号(1=坐标,2=编号)
    [RowRN] = ROW_NUMBER() OVER (PARTITION BY s.CustomerID, s.BinGrid ORDER BY (SELECT NULL))
FROM ##TempTable s
CROSS APPLY STRING_SPLIT(s.[BinGrid], ' ') s1

-- 通过分组行号关联坐标和编号
SELECT
    t1.BinInfo AS BinCoord,
    t2.BinInfo AS BinNumb
INTO ##FinalResult
FROM ##TestTemp t1
JOIN ##TestTemp t2 
    ON t1.CustomerID = t2.CustomerID 
    AND t1.BinGrid = t2.BinGrid 
    AND t1.RowRN = 1 
    AND t2.RowRN = 2

内容的提问来源于stack exchange,提问作者ayecob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:50:54