2017-02-27 70 views
0

我有一个要求,UNPIVOT类似于下面的表的表:逆透视多列

create TABLE dummy_x 
(
    EMP_NAME   VARCHAR2(100)  
, EMP_NUMBER   VARCHAR2(100) 
, PAYROLL_NAME  VARCHAR2(100) 
, PAYROLL_ID   NUMBER 
, JOB_TITLE   VARCHAR2(100) 
, JOB_TITLE_ID  NUMBER 
, LOCATION   VARCHAR2(100) 
, LOCATION_ID   NUMBER 
, NEW_PAYROLL_NAME VARCHAR2(100) 
, NEW_PAYROLL_ID  NUMBER 
, NEW_JOB_TITLE  VARCHAR2(100) 
, NEW_JOB_TITLE_ID NUMBER 
, NEW_LOCATION  VARCHAR2(100) 
, NEW_LOCATION_ID  NUMBER  
); 

INSERT INTO dummy_x (EMP_NAME, EMP_NUMBER, PAYROLL_NAME, PAYROLL_ID, JOB_TITLE, JOB_TITLE_ID, LOCATION, LOCATION_ID, NEW_PAYROLL_NAME, NEW_PAYROLL_ID, NEW_JOB_TITLE, NEW_JOB_TITLE_ID, NEW_LOCATION, NEW_LOCATION_ID) 
VALUES ('MISIP', '111X', 'PAY1', 1, 'DEVELOPER', 2, 'PHIL', 3, 'PAYPHIL', 11, 'PHIL DEV', 22, 'MANILA PH', 33); 

INSERT INTO dummy_x (EMP_NAME, EMP_NUMBER, PAYROLL_NAME, PAYROLL_ID, JOB_TITLE, JOB_TITLE_ID, LOCATION, LOCATION_ID, NEW_PAYROLL_NAME, NEW_PAYROLL_ID, NEW_JOB_TITLE, NEW_JOB_TITLE_ID, NEW_LOCATION, NEW_LOCATION_ID) 
VALUES ('FHONS', '111Y', 'PAY2', 2, 'SUPPORT', 3, 'HONDURAS', 4, 'PAYHON', 55, 'HON SUP', 66, 'SP SULA HON', 77); 

我需要的格式要像下面的东西:

EMP_NAME EMP_NUMBER  DETAILS   CURRENT_VALUE NEW_VALUE 
--------- ------------ -------------- -------------- ---------- 
MISIP  111X   PAYROLL_NAME PAY1   PAYPHIL 
          PAYROLL_ID  1    11 
          JOB_TITLE  DEVELOPER  PHIL DEV 
          JOB_TITLE_ID 2    22 
          LOCATION  PHIL   MANILA PH  
          LOCATION_ID  3    33   
FHONS  111Y   PAYROLL_NAME PAY2   PAYHON 
          PAYROLL_ID  2    55 
          JOB_TITLE  SUPPORT   HON SUP 
          JOB_TITLE_ID 3    66 
          LOCATION  HONDURAS  SP SULA HON 
          LOCATION_ID  4    77             

这是什么我到目前为止已经完成:

SELECT EMP_NAME     
    , EMP_NUMBER   
    , Details 
    , current_value 
FROM (SELECT EMP_NAME     
      , EMP_NUMBER   
      , PAYROLL_NAME   
      , cast(PAYROLL_ID as varchar2(100)) PAYROLL_ID 
      , JOB_TITLE   
      , cast(JOB_TITLE_ID as varchar2(100)) JOB_TITLE_ID 
      , LOCATION    
      , cast(LOCATION_ID as varchar2(100)) LOCATION_ID 
      , NEW_PAYROLL_NAME  
      , cast(NEW_PAYROLL_ID as varchar2(100)) NEW_PAYROLL_ID 
      , NEW_JOB_TITLE  
      , cast(NEW_JOB_TITLE_ID as varchar2(100)) NEW_JOB_TITLE_ID 
      , NEW_LOCATION   
      , cast(NEW_LOCATION_ID as varchar2(100)) NEW_LOCATION_ID 
     FROM dummy_x)  
unpivot (current_value for Details in (PAYROLL_NAME   
            , PAYROLL_ID 
            , JOB_TITLE 
            , JOB_TITLE_ID 
            , LOCATION  
            , LOCATION_ID)); 

查询输出

EMP_NAME EMP_NUMBER  DETAILS   CURRENT_VALUE NEW_VALUE 
--------- ------------ -------------- -------------- ----------         
MISIP  111X   PAYROLL_NAME PAY1 
MISIP  111X   PAYROLL_ID  1 
MISIP  111X   JOB_TITLE  DEVELOPER 
MISIP  111X   JOB_TITLE_ID 2 
MISIP  111X   LOCATION  PHIL 
MISIP  111X   LOCATION_ID  3 
FHONS  111Y   PAYROLL_NAME PAY2 
FHONS  111Y   PAYROLL_ID  2 
FHONS  111Y   JOB_TITLE  SUPPORT 
FHONS  111Y   JOB_TITLE_ID 3 
FHONS  111Y   LOCATION  HONDURAS 
FHONS  111Y   LOCATION_ID  4         

我怎么能在“新值”栏中的数据添加到这个脚本,它会可能取消从EMP_NAME和EMP_NUMBER列中的重复数据?

+1

使用您的查询输出在应用程序代码的必要的修改。 SQL不是进行这种操作的合适工具。 – GurV

+0

@GurV,不知道如何我可以继续,我使用OAF设计的应用程序。甚至对于“新价值”列有什么机会? –

回答

1

执行单元在应用程序代码合并。

对于NEW_VALUE,试试这个:

SELECT EMP_NAME     
    , EMP_NUMBER   
    , Details 
    , current_value 
    , new_value 
FROM (SELECT EMP_NAME     
      , EMP_NUMBER   
      , PAYROLL_NAME   
      , cast(PAYROLL_ID as varchar2(100)) PAYROLL_ID 
      , JOB_TITLE   
      , cast(JOB_TITLE_ID as varchar2(100)) JOB_TITLE_ID 
      , LOCATION    
      , cast(LOCATION_ID as varchar2(100)) LOCATION_ID 
      , NEW_PAYROLL_NAME  
      , cast(NEW_PAYROLL_ID as varchar2(100)) NEW_PAYROLL_ID 
      , NEW_JOB_TITLE  
      , cast(NEW_JOB_TITLE_ID as varchar2(100)) NEW_JOB_TITLE_ID 
      , NEW_LOCATION   
      , cast(NEW_LOCATION_ID as varchar2(100)) NEW_LOCATION_ID 
     FROM dummy_x)  
unpivot ((current_value, new_value) for Details in (
             (PAYROLL_NAME, NEW_PAYROLL_NAME) as 'PAYROLL_NAME' 
            , (PAYROLL_ID , NEW_PAYROLL_ID) as 'PAYROLL_ID' 
            , (JOB_TITLE , NEW_JOB_TITLE ) as 'JOB_TITLE' 
            , (JOB_TITLE_ID, NEW_JOB_TITLE_ID) as 'JOB_TITLE_ID' 
            , (LOCATION , NEW_LOCATION ) as 'LOCATION' 
            , (LOCATION_ID , NEW_LOCATION_ID) as 'LOCATION_ID' 
            ) 
     ); 
2

要得到两列比您想象的要容易得多:unpivot ((current_value, new_value) for details in...)当然,“细节”也应该成对给出,每一对都包含在(... , ...)中。例如:for ((payroll_name, new_payroll_name) as 'PAYROLL NAME', ....)

第二个要求是没有意义的。哪一行应该保持EMP_NAME和EMP_NUMBER,并应显示为空?如果你“想”的行应该得到的值实际上并不存在,或者必须在进一步处理中删除?这是你应该在你的前端应用程序(例如在SQL * Plus,在那里你想要什么是很容易做到)做的。