如何对该表格执行Unpivot操作?尝试后未获期望输出
实现表格转置(Unpivot)的正确方法
假设你的基础表包含唯一标识列(比如ID)和多个季度列(比如Q1、Q2、Q3、Q4),下面提供两种可靠的转置方案,帮你得到目标格式的表格:
方法一:用SQL原生UNPIVOT(适用于SQL Server、Oracle等支持的数据库)
如果之前用UNPIVOT失败,大概率是被转置的列数据类型不一致,或者需要保留NULL值。先确保Q1到Q4列数据类型统一,再执行以下语句:
SELECT ID, Quarter, Value FROM BaseTable UNPIVOT ( Value FOR Quarter IN (Q1, Q2, Q3, Q4) ) AS UnpivotResult;
注意:UNPIVOT会自动忽略NULL值,如果需要保留空值,建议用下面的方法二。
方法二:用UNION ALL实现转置(通用所有数据库,支持保留NULL)
这种方案兼容性极强,任何数据库都能运行,还能完整保留空值:
SELECT ID, 'Q1' AS Quarter, Q1 AS Value FROM BaseTable UNION ALL SELECT ID, 'Q2' AS Quarter, Q2 AS Value FROM BaseTable UNION ALL SELECT ID, 'Q3' AS Quarter, Q3 AS Value FROM BaseTable UNION ALL SELECT ID, 'Q4' AS Quarter, Q4 AS Value FROM BaseTable ORDER BY ID, Quarter;
针对MySQL的替代写法
MySQL没有原生UNPIVOT功能,可以用交叉连接的方式实现:
SELECT ID, CASE seq WHEN 1 THEN 'Q1' WHEN 2 THEN 'Q2' WHEN 3 THEN 'Q3' WHEN 4 THEN 'Q4' END AS Quarter, CASE seq WHEN 1 THEN Q1 WHEN 2 THEN Q2 WHEN 3 THEN Q3 WHEN 4 THEN Q4 END AS Value FROM BaseTable CROSS JOIN (SELECT 1 AS seq UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) AS seq_num ORDER BY ID, Quarter;
内容的提问来源于stack exchange,提问作者Ralph
相关产品推荐
相关产品推荐

