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

如何使用SQL创建多个透视字段完成指定数据表结构转换

提问内容

早上好,Stack Overflow社区的各位开发者:
我正尝试使用SQL创建多个透视字段,完成数据表结构转换,恳请各位提供可行的实现方案。

原始数据表结构及数据

idr_1r_2r_3q_1q_2
138941731
2827383516
3379221411
44021402945
5143324142

期望转换后的数据结构

idpv_1pv_1 valuespv_2pv_2 values
1r_138
1r_29
1r_34
1q_117
1q_231
2r_18
2r_227
2r_338
2q_135
2q_216
后续id对应数据逻辑同上

实现方案

思路

这个需求属于宽表的分类拆行操作,将r前缀字段作为第一组透视值、q前缀字段作为第二组透视值分别拆行后,用UNION ALL拼接结果即可完全匹配期望输出。

通用标准SQL代码(适配所有主流数据库)

假设原始表名为raw_data,代码如下:

-- 拆分r_前缀字段为pv_1组
SELECT 
  id,
  'r_1' AS pv_1,
  r_1 AS `pv_1 values`,
  NULL AS pv_2,
  NULL AS `pv_2 values`
FROM raw_data

UNION ALL
SELECT 
  id,
  'r_2' AS pv_1,
  r_2 AS `pv_1 values`,
  NULL AS pv_2,
  NULL AS `pv_2 values`
FROM raw_data

UNION ALL
SELECT 
  id,
  'r_3' AS pv_1,
  r_3 AS `pv_1 values`,
  NULL AS pv_2,
  NULL AS `pv_2 values`
FROM raw_data

UNION ALL
-- 拆分q_前缀字段为pv_2组
SELECT 
  id,
  NULL AS pv_1,
  NULL AS `pv_1 values`,
  'q_1' AS pv_2,
  q_1 AS `pv_2 values`
FROM raw_data

UNION ALL
SELECT 
  id,
  NULL AS pv_1,
  NULL AS `pv_1 values`,
  'q_2' AS pv_2,
  q_2 AS `pv_2 values`
FROM raw_data

-- 按id排序,匹配样例输出顺序
ORDER BY id, pv_1 IS NULL, pv_1, pv_2;

补充说明

如果使用支持UNPIVOT语法的数据库(如SQL Server、Oracle、PostgreSQL 12+),可以进一步简化代码,减少重复的SELECT语句写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:57:05