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

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;

关键逻辑说明

  1. 行号分配:内层子查询用ROW_NUMBER()函数,按ID分组,给每个分组内的CODE生成连续的行号(这里我按CODE升序排序,你可以改成ORDER BY (SELECT NULL)保持原始顺序,或者其他你需要的排序规则)。
  2. 条件聚合转列:外层用MAX(CASE...)的方式,把对应行号的CODE值映射到固定的CODE1到CODE6列中。因为每个行号在分组里只会有一个值,用MAX或者MIN都能准确拿到对应的值。
  3. 兼容性:这种写法几乎支持所有主流关系型数据库(SQL Server、MySQL、PostgreSQL、Oracle等),通用性极强。

如果某个ID下的CODE数量不足6个,对应的列会显示NULL,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:49:41