将行中的几个属性转换为 Oracle 中的列

Transposing few attributes in rows to columns in Oracle

我有一个订单table,其记录如下:

UPDATE_DATE             ORDER_ID    FIELD_NAME      FIELD_VALUE
17-07-20                300009086   Order Stage     Shipped  
15-07-20                300009086   Order Stage     Provisioned
14-07-20                300009086   Order Stage     Order Created
14-07-20                300009086   Customer Name   XYZ Corp

因此可以看出,对于单个订单 (300009086) 我们在 table 中有多个记录,每个记录对应于订单的每个特定属性。同样可以看出,当特定属性发生变化时(例如,上述示例数据中的 Order Stage),我们会在 table.

中创建一条附加记录

现在,我有一个目标 table,它看起来像下面给出的那个,它包含如下所示的记录 -

UPDATE_DATE             ORDER_ID    FIELD_NAME      OLD_FIELD_VAL      NEW_FIELD_VALUE
17-07-20                300009086   Order Stage     Provisioned         Shipped    
15-07-20                300009086   Order Stage     Order Created       Provisioned
14-07-20                300009086   Order Stage        -                Order Created 
14-07-20                300009086   Customer Name      -                XYZ Corp

因此目标 table 包含 2 个不同的列,旧值和新值,我们需要将源中的当前值记录和前一个值记录转置到目标 table 中的一行中,以便更容易报告这些数据。

所以想得到一些建议,什么是编写 SQL 来执行此转置的最佳方法。如果有人可以对此提出一些想法,将不胜感激。提前致谢。

您可以使用 lag():

select
    update_date,
    order_id,
    field_name,
    lag(field_value) 
        over(partition by order_id, field_name order by update_date) as old_field_value
    field_value as new_field_value
from mytable