简体   繁体   English

在Oracle SQL中取消枢轴化多列

[英]Unpivot Multiple Columns in Oracle SQL

I have a requirement to unpivot a table similar to the table below: 我需要取消透视表,类似于下表:

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);

I need the format to be something like below: 我需要的格式如下所示:

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                                                

This is what i've done so far: 到目前为止,这是我所做的:

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));

QUERY OUTPUT 查询输出

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                                   

How can i add the "New Value" Column data to this script and would it be possible to remove the duplicate data from the EMP_NAME and EMP_NUMBER columns? 如何将“ New Value”列数据添加到此脚本中,是否可以从EMP_NAME和EMP_NUMBER列中删除重复的数据?

To get both columns is much easier than you may think: unpivot ( (current_value, new_value) for details in...) Of course, the "details" should also be given in pairs, each enclosed in ( ... , ... ) . 要获得这两列要比您想像的要容易得多: unpivot ( (current_value, new_value) for details in...)当然,“详细信息”也应该成对给出,每对都包含在( ... , ... ) For example: for ((payroll_name, new_payroll_name) as 'PAYROLL NAME', .... ) 例如: for ((payroll_name, new_payroll_name) as 'PAYROLL NAME', .... )

The second requirement doesn't make sense. 第二个要求没有道理。 Which row should keep the EMP_NAME and the EMP_NUMBER, and which should show NULL? 哪一行应保留EMP_NAME和EMP_NUMBER,哪一行应显示NULL? What if the row you "think" should get the values doesn't actually exist, or must be deleted in further processing? 如果您“认为”应获取值的行实际上不存在,或者必须在进一步处理中删除该行怎么办? THAT is something you should do in your front-end application (for example in SQL*Plus, where what you want is easy to do). 您应该在前端应用程序中执行此操作(例如,在SQL * Plus中,您可以轻松执行所需的操作)。

Do the cell merging in your application code. 将单元格合并到您的应用程序代码中。

For new_value, try this: 对于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