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

SQL数据重组:如何将同分组行数据转为多列视图

实现SQL行转列:将多行Data转为多列视图

通用兼容方案(适用于多数数据库)

核心思路是按Username和Type分组,用CASE WHEN配合聚合函数MAX,把不同的Data值映射到对应的列:

CREATE VIEW target_view AS
SELECT
    Username,
    Type,
    MAX(CASE WHEN Data = 'Data1' THEN Data END) AS Data1,
    MAX(CASE WHEN Data = 'Data2' THEN Data END) AS Data2,
    MAX(CASE WHEN Data = 'Data3' THEN Data END) AS Data3
FROM
    your_table_name  -- 替换成你的实际表名
GROUP BY
    Username, Type;

这个写法兼容性极强,不管是MySQL、SQL Server、PostgreSQL还是Oracle都能直接用,只要你的Data取值固定为Data1、Data2、Data3就没问题。

MySQL 专属写法

如果用MySQL,还可以借助GROUP_CONCAT拼接后再拆分,适合需要按顺序提取值的场景:

CREATE VIEW target_view AS
SELECT
    Username,
    Type,
    SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(Data ORDER BY Data), ',', 1), ',', -1) AS Data1,
    SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(Data ORDER BY Data), ',', 2), ',', -1) AS Data2,
    SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(Data ORDER BY Data), ',', 3), ',', -1) AS Data3
FROM
    your_table_name
GROUP BY
    Username, Type;

注意ORDER BY Data是为了保证拼接后的顺序和列对应,避免错位。

SQL Server 专属写法

SQL Server提供了PIVOT运算符,专门处理行转列,语法更简洁:

CREATE VIEW target_view AS
SELECT
    Username,
    Type,
    [Data1],
    [Data2],
    [Data3]
FROM
    your_table_name
PIVOT
(
    MAX(Data)  -- 用MAX聚合,因为每组对应唯一值
    FOR Data IN ([Data1], [Data2], [Data3])
) AS PivotTable;

PostgreSQL 专属写法

PostgreSQL需要先启用tablefunc扩展,再用crosstab函数实现:

  1. 先启用扩展:
CREATE EXTENSION IF NOT EXISTS tablefunc;
  1. 创建视图:
CREATE VIEW target_view AS
SELECT
    Username,
    Type,
    Data1,
    Data2,
    Data3
FROM
    crosstab(
        'SELECT Username, Type, Data FROM your_table_name ORDER BY Username, Type, Data',
        'SELECT unnest(''{Data1,Data2,Data3}''::text[])'
    ) AS ct(Username text, Type int, Data1 text, Data2 text, Data3 text);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:45:59