透视/转置标题表到行
Posted
技术标签:
【中文标题】透视/转置标题表到行【英文标题】:Pivot / Transpose header table to rows 【发布时间】:2019-05-15 04:13:19 【问题描述】:我有一个如下所示的表格:
part_num | type | color | material
_________|_______|_______|_____________
1234 | filter| white | steel
此表有零件编号、零件类型、颜色和材料。
如何旋转/转置表格以获得以下输出:
part |AttrName| AttrValue
_____|________|__________
1234 |type | filter
1234 |color | white
1234 |material| steel
Oracle 数据库 12c - 12.2.2 我以前没有使用过 pivot 或 unpivot,所以解释一下会很好理解其中的区别。
谢谢。
【问题讨论】:
【参考方案1】:一种简单的方法使用一系列联合:
WITH cte AS (
SELECT part_num AS part, 'type' AS AttrName, "type" AS AttrValue FROM yourTable UNION ALL
SELECT part_num, 'color', color FROM yourTable UNION ALL
SELECT part_num, 'material', material FROM yourTable
)
SELECT part, AttrName, AttrValue
FROM cte
ORDER BY part;
Demo
【讨论】:
【参考方案2】:您可以在 oracle 11g 中使用UNPIVOT
,但如果您的版本较低,那么UNION ALL
可能是一种方法
DEMO
SELECT *
FROM t UNPIVOT (AttrValue FOR AttrName IN(
type,color,material))
输出:
ART_NUM ATTRNAME ATTRVALUE
1234 TYPES filter
1234 COLOR white
1234 MATERIAL steel
【讨论】:
【参考方案3】:Oracle 12C 支持横向连接,所以我会使用:
select t.part_num, x.*
from t cross apply
(select 'type' as AttrName, "type" as AttrValue from dual union all
select 'color', color from dual union all
select 'material', material from dual
) x;
Here 是一个 dbfiddle。
注意,Oracle 也支持这种语法:
select t.part_num, x.*
from t cross join lateral
(select 'type' as AttrName, "type" as AttrValue from dual union all
select 'color', color from dual union all
select 'material', material from dual
) x;
【讨论】:
以上是关于透视/转置标题表到行的主要内容,如果未能解决你的问题,请参考以下文章