Oracle 将行转换为列

Posted

技术标签:

【中文标题】Oracle 将行转换为列【英文标题】:Oracle Pivot rows into columns 【发布时间】:2019-05-17 03:21:10 【问题描述】:

我有一个如下所示的表格:

PART_ID  | ATTR_GROUP | ATTR_VALUE1 | ATTR_VALUE2 | COLUMN_NAME
--------------------------------------------------
M2CV4    | GROUP-A    | MATERIAL   |   N/A        |  ATTR_X1
M2CV4    | GROUP-A    | GRADE      |    A         |  ATTR_X2
M2CV4    | GROUP-B    | DOC ID     |   1234       |  ATTR_X1
M2CV4    | GROUP-B    | DOC TYPE   |   XX         |  ATTR_X2

我想将表格旋转成如下所示:

PART_ID | ATTR_GROUP | ATTR_X1 | ATTR_X1_VALUE | ATTR_X2    | ATTR_X2_VALUE
---------------------------------------------------------------------------
M2CV4   | GROUP-A    | MATERIAL|   N/A         | GRADE      |  A
M2CV4   | GROUP-B    | DOC ID  |   1234        | DOC TYPE   | XX

一个零件 ID 可以有多个文档,所以如果 M2CV4 有 3 个文档,那么输出将是

PART_ID | ATTR_GROUP | ATTR_X1 | ATTR_X1_VALUE | ATTR_X2| ATTR_X2_VALUE
---------------------------------------------------------------------------
M2CV4   | GROUP-A    | MATERIAL|   N/A         | GRADE      |  A
M2CV4   | GROUP-B    | DOC ID  |   1234        | DOC TYPE   | XX
M2CV4   | GROUP-B    | DOC ID  |   456         | DOC TYPE   | XX
M2CV4   | GROUP-B    | DOC ID  |   333         | DOC TYPE   | XX

Oracle 数据库 12c - 12.2.2 版本。 我在这里给出了 2 列的示例,但我确实有更多内容将根据组和 column_name 填充

感谢您的帮助。欣赏它。

【问题讨论】:

三个文档的 source 数据是什么样的? 对于 3 个文档的情况,我们确实需要一个额外的列来区分 3 个文档中的每一个。 DocID like "AB1" Doc Type like "XCV" DocID like "XC1" Doc Type like "XCV" @TimBiegeleisen Hi Tim - 我在上面举了一个更好的例子。 如果您无法响应我的数据请求,那么很遗憾,我无法为您提供帮助。 Gordon 给了您一个查询,但可能不会涵盖您所有的边缘情况。 【参考方案1】:

如果我理解正确,您希望在不同的行上重复。无论如何,我建议使用条件聚合进行旋转。如果这样做,您可以使用row_number() 解决问题:

select part_id, attr_group,
       max(case when column_name = 'ATTR_X1' then attr_value end) as attr_x1,
       max(case when column_name = 'ATTR_X2' then attr_value end) as attr_x2
from (select t.*,
             row_number() over (partition by part_id, attr_group, column_name order by column_name) as seqnum
      from t
     ) t
group by part_id, attr_group, seqnum;

【讨论】:

以上是关于Oracle 将行转换为列的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL 将行转换为列

带有条件的 Oracle SQL Pivot 将行转换为列

Oracle SQL Developer:如何使用 PIVOT 函数将行转置为列

分组后将行值显示为列-Oracle

在 Oracle 中动态地将行转为列

到标题 oracle 的列值