복붙노트

[SQL] 두 개의 열을 사용하여 데이터의 피벗

SQL

두 개의 열을 사용하여 데이터의 피벗

나는 피봇 형식의 데이터가 있습니다. 그것은 다음과 같습니다 :

-----------------------------------------
| user_id |  org  |   position  | lang  |
-----------------------------------------
|   1001  |   USE |   Boss      | EN    |
|   1001  |   USD |   Bossa     | FI    |
|   1002  |   GWR |   Dim       | SV    |
|   1003  |   GGA |   DCS       | FI    |
|   1003  |   GCA |   DDD       | SV    |
-----------------------------------------

나는 데이터로 표현하고 싶습니다 :

-------------------------------------------------------------------------------------
| user_id | org_fi |  position_fi |   org_en | position_en  | org_sv  | position_sv |
-------------------------------------------------------------------------------------
|  1001   |   USD  |    Bossa     |   USE    |   Boss       |         |             |
|  1002   |        |              |          |              | GWR     |  Dim        |
|  1003   |   GGA  |    DCS       |          |              | GCA     |  DDD        |
------------------------------------------------------------------------------------- 

나는 명령에 의해 연결이있는 피벗 쿼리가 필요하다고 생각합니다.

이것은 내가하려고 것입니다 :

SELECT user_id, 
    org, 
    position, 
    lang, 
    ROW_NUMBER () OVER (PARTITION BY lang, user_id ORDER BY ROWID) rn
 FROM source

그러나, 나는 앞으로 이동하는 방법을 모른다.

해결법

  1. ==============================

    1.여기에 원하는 형식의 데이터를 얻을 수있는 방법은 다음과 같습니다

    여기에 원하는 형식의 데이터를 얻을 수있는 방법은 다음과 같습니다

    SELECT user_id, 
      max(case when lang = 'FI' THEN org ELSE ' ' END) org_fi,
      max(case when lang = 'FI' THEN position ELSE ' ' END) position_fi,
      max(case when lang = 'EN' THEN org ELSE ' ' END) org_en,
      max(case when lang = 'EN' THEN position ELSE ' ' END) position_en,
      max(case when lang = 'SV' THEN org ELSE ' ' END) org_sv,
      max(case when lang = 'SV' THEN position ELSE ' ' END) position_sv
    FROM source
    group by user_id
    order by user_id
    

    데모와 SQL 바이올린을 참조하십시오

  2. ==============================

    2.PIVOT 잘 작동합니다 - SQL 바이올린 데모 (bluefeets 응답에서 차용 스키마)

    PIVOT 잘 작동합니다 - SQL 바이올린 데모 (bluefeets 응답에서 차용 스키마)

    SELECT *
    FROM   source
    PIVOT (
            MIN(org) AS org,
            MIN(position) AS position
            FOR lang
            IN('EN' AS en, 'FI' AS fi, 'SV' AS sv)
          );
    
  3. ==============================

    3.11gr2 PIVOT 예

    11gr2 PIVOT 예

    SQL> create table t1
    (
    user_id number,
    org varchar2(10),
    position varchar2(10),
    lang varchar2(10)
    )
    Table created.
    SQL> insert into t1 values (1,'ABC','VVV','EN')
    1 row created.
    SQL> insert into t1 values (1,'DEF','WWW','FI')
    1 row created.
    SQL> insert into t1 values (2,'GHI','XXX','FI')
    1 row created.
    SQL> insert into t1 values (2,'JKL','YYY','SV')
    1 row created.
    SQL> insert into t1 values (3,'MNO','ZZZ','EN')
    1 row created.
    SQL> commit
    Commit complete.
    SQL> select * from t1
    
       USER_ID ORG        POSITION   LANG     
    ---------- ---------- ---------- ----------
             1 ABC        VVV        EN        
             1 DEF        WWW        FI       
             2 GHI        XXX        FI       
             2 JKL        YYY        SV       
             3 MNO        ZZZ        EN       
    
    5 rows selected.
    SQL> select * from t1
    pivot(max(org) as org, max(position) as position for lang in ('EN' as "EN",'FI' as "FI",'SV' as "SV"))
    
       USER_ID EN_ORG     EN_POSITION FI_ORG     FI_POSITION SV_ORG     SV_POSITION
    ---------- ---------- ----------- ---------- ----------- ---------- -----------
             1 ABC        VVV         DEF        WWW                              
             2                        GHI        XXX         JKL        YYY       
             3 MNO        ZZZ                                                     
    
    3 rows selected.
    
  4. from https://stackoverflow.com/questions/11987067/pivoting-of-data-using-two-columns by cc-by-sa and MIT license