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 将行转换为列的主要内容,如果未能解决你的问题,请参考以下文章