使用两列旋转数据

Jaa*_*nna 16 sql oracle oracle11g

我有透视格式的数据.它看起来像这样:

-----------------------------------------
| 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    |
-----------------------------------------
Run Code Online (Sandbox Code Playgroud)

我想将数据表示为:

-------------------------------------------------------------------------------------
| 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        |
------------------------------------------------------------------------------------- 
Run Code Online (Sandbox Code Playgroud)

我认为需要使用connect by命令进行数据透视查询.


这就是我试图做的事情:

SELECT user_id, 
    org, 
    position, 
    lang, 
    ROW_NUMBER () OVER (PARTITION BY lang, user_id ORDER BY ROWID) rn
 FROM source
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何前进.

Pet*_*ang 48

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)
      );
Run Code Online (Sandbox Code Playgroud)

  • +1我不知道你可以像这样在两列上转动.非常好 (7认同)

Tar*_*ryn 11

这是一种以您想要的格式获取数据的方法:

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
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo