SQL中如何将多行CODE数据转为固定列CODE1至CODE6?
解决方案:固定列名的行转列(无需动态PIVOT)
没问题,这种已知要转成固定列名(CODE1到CODE6)但列值不确定的行转列需求,用「窗口函数+条件聚合」就能轻松实现,完全不用复杂的动态PIVOT。下面直接上可运行的代码和简单解释:
第一步:模拟源数据(替换成你的实际表即可)
-- 先模拟你的原始数据结构和内容 WITH SourceData AS ( SELECT 1 AS ID, 'abc' AS CODE UNION ALL SELECT 1 AS ID, 'xyz' AS CODE UNION ALL SELECT 1 AS ID, 'def' AS CODE UNION ALL SELECT 1 AS ID, 'pqr' AS CODE UNION ALL SELECT 1 AS ID, 'jkl' AS CODE UNION ALL SELECT 1 AS ID, 'tuv' AS CODE )
第二步:核心行转列查询
SELECT ID, MAX(CASE WHEN RowNum = 1 THEN CODE END) AS CODE1, MAX(CASE WHEN RowNum = 2 THEN CODE END) AS CODE2, MAX(CASE WHEN RowNum = 3 THEN CODE END) AS CODE3, MAX(CASE WHEN RowNum = 4 THEN CODE END) AS CODE4, MAX(CASE WHEN RowNum = 5 THEN CODE END) AS CODE5, MAX(CASE WHEN RowNum = 6 THEN CODE END) AS CODE6 FROM ( SELECT ID, CODE, -- 给每个ID下的CODE分配连续行号,排序规则可按需调整 ROW_NUMBER() OVER (PARTITION BY ID ORDER BY CODE) AS RowNum FROM SourceData ) t GROUP BY ID;
关键逻辑说明
- 行号分配:内层子查询用
ROW_NUMBER()函数,按ID分组,给每个分组内的CODE生成连续的行号(这里我按CODE升序排序,你可以改成ORDER BY (SELECT NULL)保持原始顺序,或者其他你需要的排序规则)。 - 条件聚合转列:外层用
MAX(CASE...)的方式,把对应行号的CODE值映射到固定的CODE1到CODE6列中。因为每个行号在分组里只会有一个值,用MAX或者MIN都能准确拿到对应的值。 - 兼容性:这种写法几乎支持所有主流关系型数据库(SQL Server、MySQL、PostgreSQL、Oracle等),通用性极强。
如果某个ID下的CODE数量不足6个,对应的列会显示NULL,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Priyank Patel
相关产品推荐
相关产品推荐

