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

Oracle动态转置(Transpose/Pivot)实现方案咨询

动态实现宽表转窄表(列转行)

方法1:SQL(适配任意列数)

核心是将多列(C1、C2...Cn)转换为多行的Category和Category_Value字段,同时保留ID关联。

通用动态SQL(适配多数数据库)

先自动获取所有需要转行的列名(排除ID列),再动态生成UNION ALL语句:

-- 以MySQL为例,其他数据库语法略有调整
SET @sql = NULL;
SELECT GROUP_CONCAT(
    CONCAT(
        'SELECT ID, ''', column_name, ''' AS Category, ', column_name, ' AS Category_Value FROM your_table'
    ) SEPARATOR ' UNION ALL '
) INTO @sql
FROM information_schema.columns
WHERE table_name = 'your_table' AND column_name != 'ID';

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

专用语法(如SQL Server)

利用数据库原生UNPIVOT语法,配合动态SQL自动识别列:

DECLARE @cols NVARCHAR(MAX), @query NVARCHAR(MAX);
SELECT @cols = STRING_AGG(QUOTENAME(column_name), ', ')
FROM information_schema.columns
WHERE table_name = 'your_table' AND column_name != 'ID';

SET @query = '
SELECT ID, Category, Category_Value
FROM your_table
UNPIVOT (
    Category_Value FOR Category IN (' + @cols + ')
) AS unpivoted_table';

EXEC sp_executesql @query;

方法2:Python Pandas(自动适配列变化)

用Pandas的melt函数,无需手动指定列名,自动处理所有非ID列:

import pandas as pd

# 读取原表数据(支持CSV、数据库等多种来源)
df = pd.read_csv('your_table.csv')
# 从数据库读取示例:df = pd.read_sql('SELECT * FROM your_table', db_connection)

# 执行列转行
melted_df = df.melt(
    id_vars=['ID'],
    var_name='Category',
    value_name='Category_Value'
)

# 输出或保存结果
print(melted_df)
melted_df.to_csv('transformed_table.csv', index=False)

方法3:Excel Power Query(动态刷新适配新增列)

适合Excel用户,后续新增列时仅需刷新数据即可自动更新:

  1. 选中原数据区域,点击数据选项卡 → 从表格/区域,导入Power Query编辑器
  2. 选中ID列,点击转换选项卡 → 逆透视列 → 逆透视其他列
  3. 将自动生成的"属性"列重命名为Category,"值"列重命名为Category_Value
  4. 点击关闭并上载,导出结果到新工作表;后续新增列后,右键点击结果表选择刷新即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 05:39:17