Oracle SQL 根据数据属性的重复顺序将多行合并为一行

问题描述 投票:0回答:1

我想编写一个 Oracle 查询来转换下表

Attribute       Value
product_id      P1
product_name            AAA
product_id      P2
product_name            BBB
product_id      P3
product_name            CCC

进入以下输出:

product_id  product_name
P1          AAA
P2          BBB
P3          CCC

每个产品的属性始终处于正确的顺序,因为我将它们从基于结构属性的 XML 数据转换而来。例如:

....

感谢您的帮助。

我尝试使用

PIVOT
,但它需要在枢轴操作中使用聚合函数,在我的例子中,我没有任何列来应用聚合函数。

sql oracle-database data-conversion
1个回答
0
投票

您可以使用 ROW_NUMBER() 为每行生成递增序列(根据您在暂存区中所述的假设,行将按顺序排列)。将生成的行号除以2(先偏移1)生成

grouping
。使用
grouping
生成所需结果的数据透视表。

WITH CTE(Attribute, Value, grouping) AS (
    SELECT p.*, TRUNC((ROW_NUMBER() OVER(ORDER BY null)-1)/2) grouping FROM Product p
), PIVOT_TABLE(grouping, product_id, product_name) AS (
    SELECT * FROM CTE
    PIVOT
    (
      MAX(Value)
      FOR Attribute IN ('product_id', 'product_name')
    )
    ORDER BY grouping
)
SELECT product_id, product_name FROM PIVOT_TABLE

数据库小提琴

© www.soinside.com 2019 - 2024. All rights reserved.