sql—在oracle中将行中的一些属性转换为列

ki1q1bka  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(434)

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

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),我们在表中有多条记录,每条记录对应于订单的每个特定属性。同样可以看到,当一个特定的属性发生变化时(例如,上面的示例数据中的order stage),我们会在表中创建一个额外的记录。
现在,我有一个目标表,看起来像下面给出的表,它包含如下所示的记录-

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

因此,目标表包含两个不同的列,旧值和新值,我们需要将源中的当前值和前一个值记录转换为目标表中的一行,以便更容易对这些数据进行报告。
因此,我想得到一些建议,比如编写sql来实现这种转置的最佳方法是什么。如果有人能给点建议我会很感激的。提前谢谢。

i5desfxk

i5desfxk1#

你可以用 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

相关问题