如何用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)
| BinCoord | RN |
|---|---|
| (27,1) | 1 |
| (1,34) | 3 |
编号临时表(##NameTemp)
| BinNumb | RN |
|---|---|
| S,S,S | 2 |
| F,F,F | 4 |
期望输出
| BinCoord | BinNumb |
|---|---|
| (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
相关产品推荐
相关产品推荐

