透视/转置标题表到行

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;

【讨论】:

以上是关于透视/转置标题表到行的主要内容,如果未能解决你的问题,请参考以下文章

如何从列转置到行?

如何转置 Excel 数据透视表

在 SQL 中将行转置为列标题

将行转置为不聚合的列

将行转置为单列

mysql 将行转置为列