【问题标题】:Pivoting rows into columns Oracle SQL将行透视到列 Oracle SQL
【发布时间】:2021-01-21 13:07:04
【问题描述】:

我目前正在处理一个表格,表格的格式是这样的(所有列都是 VARCHAR 类型,除了 INSERTDATE 列是 DATE 类型):

INSERTDATE | ID   | PROPERTYNAME  | PROPERTYVALUE
----------------------------------------------
date1      | 1000 | ItemNumber    | 20.1A14
date1      | 1000 | ItemRev       | 2
date1      | 1000 | BarCodeNumber | 3854981
date2      | 1001 | ItemNumber    | 20.1B24
date2      | 1001 | ItemRev       | 1
date2      | 1001 | BarCodeNumber | 3856539

我想要做的是将所有 PROPERTYNAME 列值转换为单独的列,并将它们各自的 PROPERTYVALUE 列值转换为各自的列,如下所示:

INSERTDATE | ID   | ItemNumber | ItemRev | BarCodeNumber
-------------------------------------------------------
date1      | 1000 | 20.1A14    | 2       | 3854981
date2      | 1001 | 20.1B24    | 1       | 3856539

我几天来一直试图解决这个问题,但没有任何结果。我在互联网上查找了 Pivot 上的所有内容,但没有一个示例符合我自己的需求。我对 SQL 中的 Pivot 不太熟悉,所以如果有人能帮助我弄清楚如何使用它来解决我的问题,那将非常有帮助。

【问题讨论】:

    标签: sql oracle-sqldeveloper


    【解决方案1】:

    如果你知道你想要的列,你可以使用条件聚合:

    select insertdate, id,
           max(case when PROPERTYNAME = 'ItemNumber' then propertyvalue end) as ItemNumber,
           max(case when PROPERTYNAME = 'ItemRev' then propertyvalue end) as ItemRev,
           max(case when PROPERTYNAME = 'BarCodeNumber' then propertyvalue end) as BarCodeNumber
    from t
    group by insertdate, id;
    

    如果您事先不知道所有属性,则需要将查询动态构造为字符串并使用execute immediate

    【讨论】:

      【解决方案2】:

      用例是PIVOT 的合适人选,您可以在这里完美地使用它。

      假设您使用 Oracle 作为数据库,查询将如下所示,

      select insertdate,id,ItemNumber,ItemRev,BarCodeNumber
        from mytable
      pivot
      (
       max(propertyvalue)
       for propertyname in ('ItemNumber' as ItemNumber
                           ,'ItemRev' ItemRev
                           ,'BarCodeNumber' BarCodeNumber)
      )
      order by insertdate;
      

      【讨论】:

      • @B Basak,正如您特别要求的 PIVOT,即使已经有答案,我也有兴趣回答。出于好奇,它不适用于您的用例吗?
      猜你喜欢
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多