如何在SQL Server中将逗号分隔值拆分至对应列?
问题分析与解决
你的核心问题是错误地用行号(ROW_NUMBER())作为透视的列标识,导致拆分出的数字无法对应到同名的目标列。原查询里生成的Col是拆分后的行顺序编号(1、2、3...),但你需要的是把每个拆分出的数字直接映射到同名列,比如拆分出的3要放到[3]列。
修正后的SQL查询
SELECT MemberTransId, AccessZone, ISNULL([1], '') AS [1], ISNULL([2], '') AS [2], ISNULL([3], '') AS [3], ISNULL([4], '') AS [4], ISNULL([5], '') AS [5], ISNULL([6], '') AS [6], ISNULL([7], '') AS [7], ISNULL([8], '') AS [8], ISNULL([9], '') AS [9], ISNULL([10], '') AS [10] FROM ( SELECT MemberTransId, AccessZone, Split.value AS Col, -- 直接用拆分出的数字作为透视列的标识 Split.value FROM dbo.tbl_MemberTransaction AS Emp CROSS APPLY String_split(AccessZone, ',') AS Split -- 可选:过滤掉1-10以外的无效数值 WHERE ISNUMERIC(Split.value) = 1 AND CAST(Split.value AS INT) BETWEEN 1 AND 10 ) AS tbl PIVOT ( MAX(Value) FOR Col IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10]) ) AS Pvt
关键修正点
- 子查询中
Col直接使用Split.value,让拆分出的数字和目标列名一一对应,这是解决错位的核心 - 移除了多余的
ROW_NUMBER()逻辑,它是导致列映射错误的根源 - 增加可选的
WHERE子句,过滤掉不符合1-10范围的数值,避免无效数据干扰 - 删掉了原查询中多余的
[11]列(根据你描述的数值范围无需保留)
内容的提问来源于stack exchange,提问作者Sreejith
相关产品推荐
相关产品推荐

