簡體   English   中英

在Oracle SQL中取消樞軸化多列

[英]Unpivot Multiple Columns in Oracle SQL

我需要取消透視表,類似於下表:

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                                   

如何將“ New Value”列數據添加到此腳本中,是否可以從EMP_NAME和EMP_NUMBER列中刪除重復的數據?

要獲得這兩列要比您想像的要容易得多: unpivot ( (current_value, new_value) for details in...)當然,“詳細信息”也應該成對給出,每對都包含在( ... , ... ) 例如: for ((payroll_name, new_payroll_name) as 'PAYROLL NAME', .... )

第二個要求沒有道理。 哪一行應保留EMP_NAME和EMP_NUMBER,哪一行應顯示NULL? 如果您“認為”應獲取值的行實際上不存在,或者必須在進一步處理中刪除該行怎么辦? 您應該在前端應用程序中執行此操作(例如,在SQL * Plus中,您可以輕松執行所需的操作)。

將單元格合並到您的應用程序代碼中。

對於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'
                                   )
        );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM