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

如何使用SQL将同组多行数据转换为单行多列格式?

多行转单行多列的SQL实现

针对同一CLASS分组的多条记录,将其转换为单行多列格式,每组对应ID、NAME、AGE字段,可通过窗口函数+条件聚合实现,具体方案如下:

1. 测试数据准备

先创建测试表并插入示例数据:

-- 创建测试表
CREATE TABLE student (
    CLASS VARCHAR(10),
    ID VARCHAR(10),
    NAME VARCHAR(20),
    AGE INT
);

-- 插入示例数据
INSERT INTO student (CLASS, ID, NAME, AGE)
VALUES 
('ST1', 'A1', 'ALI', 12),
('ST1', 'B1', 'MING', 13),
('ST1', 'C1', 'ABU', 12);

2. 核心转换SQL

SELECT 
    CLASS,
    MAX(CASE WHEN rn = 1 THEN ID END) AS ID_1,
    MAX(CASE WHEN rn = 1 THEN NAME END) AS NAME_1,
    MAX(CASE WHEN rn = 1 THEN AGE END) AS AGE_1,
    MAX(CASE WHEN rn = 2 THEN ID END) AS ID_2,
    MAX(CASE WHEN rn = 2 THEN NAME END) AS NAME_2,
    MAX(CASE WHEN rn = 2 THEN AGE END) AS AGE_2,
    MAX(CASE WHEN rn = 3 THEN ID END) AS ID_3,
    MAX(CASE WHEN rn = 3 THEN NAME END) AS NAME_3,
    MAX(CASE WHEN rn = 3 THEN AGE END) AS AGE_3
FROM (
    SELECT 
        CLASS,
        ID,
        NAME,
        AGE,
        -- 给每个CLASS分组内的记录编号
        ROW_NUMBER() OVER (PARTITION BY CLASS ORDER BY ID) AS rn
    FROM student
) t
GROUP BY CLASS;

3. 逻辑说明

  • 子查询中用ROW_NUMBER()按CLASS分组、ID排序,给每条记录分配唯一序号rn,确保同一分组内的记录可被区分;
  • 外层通过MAX(CASE...)进行条件聚合:根据序号rn,将不同行的字段值映射到对应的列上,MAX用于过滤NULL值(每个序号仅对应一条有效记录,其余为NULL)。

4. 预期结果

CLASSID_1NAME_1AGE_1ID_2NAME_2AGE_2ID_3NAME_3AGE_3
ST1A1ALI12B1MING13C1ABU12

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:32:31