使用 pivot 在 oracle 11g 中进行数据格式化

Data formatting in oracle 11g using pivot

我在 oracle 11g 中有一个 table 属性作为

order           attribute                            value
-------------------------------------------------------------------------
802605          CL_ACC844FIBRE_SERVICE                  N

802605          CL_ACC844FIBRE_SERVICE_LOCATION         N

802605          CL_ACC844FLOOR                          GROUND

802605           CL_ACC844HAZARD                        BTSS  

802605          CL_ACC844HOUSING                        CABINET

802605          CL_ACC844TEAM                           EDINBURGH

802605          CL_ACC844LANDLORDS_CONSENT                Y

802605         CL_ACC844LANDLORDS_NECESSARY                N

802605         CL_ACC844LANDLORD_NAME                   NOT APPLICABLE

802605          CL_ACC844LANDLORD_PHONE                 NOT APPLICABLE

802605          CL_ACC844LOCATION                       ROOM 

802605         CL_ACC844MAINTENANCE_CAT                 FIBRE 

802605         CL_ACC844NTE_CHASSIS                     SINGLE SLOT

802605         CL_ACC844OCCUPANCY_COMMENCE_DATE         17/02/2012

每个订单包含数百个这样的属性

我想要的数据格式是这样的

ORDER   TECH  BLEACH  AF1        AF2            AF3         AF4     EF
-----------------------------------------------------------------------------
802605   N     YES  11/10/2007  11/10/2007  11/10/2007  11/10/2007  1/10/2007

我用来获取数据的查询是

SELECT a1.order ,
       a1.value tech  ,
       a2.value bleach  ,
       a3.value af1  ,
       a4.value af2  ,
       a5.value af3  ,
       a6.value af4  ,
       a7.value ef  
  FROM attributes a1,
       attributes a2,
       attributes a3,
       attributes a4,
       attributes a5,
       attributes a6,
       attributes a7
 WHERE a1.order = '802605-S844'
         AND a1.order = a2.order
         AND ( a1.atribute LIKE 'CL_ACC%G_ADSL_DETAILS_ACCESS_TECHNOLOGY'
         OR a2.atribute LIKE 'CL_ACC%G_VCG_DETAILS1COS_BLEACHING_FLAG'
         OR a3.atribute LIKE 'CL_ACC%G_VCG_DETAILS1G_6LAYER_COS_CIPR_AF1'
         OR a4.atribute LIKE 'CL_ACC%G_VCG_DETAILS1G_6LAYER_COS_CIPR_AF2'
         OR a5.atribute LIKE 'CL_ACC%G_VCG_DETAILS1G_6LAYER_COS_CIPR_AF3'
         OR a6.atribute LIKE 'CL_ACC%G_VCG_DETAILS1G_6LAYER_COS_CIPR_AF4'
         Or A7.atribute Like 'CL_ACC%G_VCG_DETAILS1G_6LAYER_COS_CIPR_EF' );

我知道这不是使用自联接格式化数据的正确方法,而且我必须获取 400 个订单的数据,因此查询需要几天时间才能显示数据。 有人可以提供更好的方法来格式化数据。我试过使用 PIVOT 但无法获取它。

SELECT order,
       MAX( CASE WHEN attribute LIKE 'CL_ACC%G_ADSL_DETAILS1COS_BLEACHING_FLAG'
                 THEN value END ) AS tech,
       MAX( CASE WHEN attribute LIKE 'CL_ACC%G_ADSL_DETAILS1G_6LAYER_COS_CIPR_AF1'
                 THEN value END ) AS bleach,
       MAX( CASE WHEN attribute LIKE 'CL_ACC%G_ADSL_DETAILS1G_6LAYER_COS_CIPR_AF2'
                 THEN value END ) AS af1,
       MAX( CASE WHEN attribute LIKE 'CL_ACC%G_ADSL_DETAILS1G_6LAYER_COS_CIPR_AF3'
                 THEN value END ) AS af2,
       MAX( CASE WHEN attribute LIKE 'CL_ACC%G_ADSL_DETAILS1G_6LAYER_COS_CIPR_AF4'
                 THEN value END ) AS af3,
       MAX( CASE WHEN attribute LIKE 'CL_ACC%G_ADSL_DETAILS1G_6LAYER_COS_CIPR_EF'
                 THEN value END ) AS af4,
       MAX( CASE WHEN attribute LIKE 'CL_ACC%G_ADSL_DETAILS_ACCESS_TECHNOLOGY'
                 THEN TO_DATE( value, 'DD/MM/YYYY' ) END ) AS ef
FROM   attributes
WHERE  order IN ( '802605-S844' /*, ...*/ )
GROUP BY order;