2017-02-27 61 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,在那裏你想要什麼是很容易做到)做的。