Sql 具有多种数据类型的Oracle unpivot

Sql 具有多种数据类型的Oracle unpivot,sql,oracle,unpivot,Sql,Oracle,Unpivot,预期产量 ID VT_Type1 Vt_type2 VT_Type3 Status_1 Status_2 Status_3 Date_1 Date_2 Date_3 1 -1 -1 0 X Y 2 04/12 05/12 06/12 2 -1 -1 -1 A B 1 06/12 07/12 07/10 我可以通过引用本文中的答

预期产量

ID VT_Type1 Vt_type2 VT_Type3 Status_1 Status_2 Status_3 Date_1 Date_2 Date_3
 1       -1       -1        0 X        Y        2        04/12  05/12  06/12
 2       -1       -1       -1 A        B        1        06/12  07/12  07/10

我可以通过引用本文中的答案获得预期结果,但在我的表中,我引用的列具有不同的数据类型。就像如果VT_Type3是-1,那么我应该从状态_3读取数据,状态_3是数字,而其他两列是varchar2

首先,使用子查询将
Status_3
列转换为与其他列相同的类型:

Id Type Status Date
1   1    X     04/12
1   2    Y     05/12
2   1    A     06/12
2   2    B     07/12
2   3    1     07/10
WITH test_data (
  ID,
  VT_Type1, Vt_type2, VT_Type3,
  Status_1, Status_2, Status_3, 
  Date_1, Date_2, Date_3
) AS (
       SELECT 1, -1, -1,  0, 'X', 'Y', 2, '04/12', '05/12', '06/12' FROM DUAL UNION ALL
       SELECT 2, -1, -1, -1, 'A', 'B', 1, '06/12', '07/12', '07/10' FROM DUAL
     )
SELECT  id, type, status, dt AS "DATE"
FROM    ( SELECT ID,
                 VT_Type1,
                 Vt_type2,
                 VT_Type3,
                 Status_1,
                 Status_2,
                 TO_CHAR( Status_3 ) AS status_3,
                 Date_1,
                 Date_2,
                 Date_3
          FROM   test_data
UNPIVOT ( (vt_type, status, dt)
          FOR type IN (
            ( vt_type1, status_1, date_1 ) as 1,
            ( vt_type2, status_2, date_2 ) as 2,
            ( vt_type3, status_3, date_3 ) as 3
          )
        )
WHERE   vt_type != 0;