2012-08-16 12 views
13

Tengo datos en formato girado. Se ve así:Giro de datos usando dos columnas

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

Me gustaría tener los datos representados como:

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

creo que es necesaria una consulta de pivote con conexión por el comando.


Esto es lo que he intentado hacer:

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

Sin embargo, no tengo idea de cómo seguir adelante.

+0

¿Intentó utilizar el comando PIVOT? http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html – tbone

+0

sí, traté de usar el pivote. Pero el problema es que obtengo 1, 2, 3, 4, 5 ... en valor rn de mi consulta, así que estoy un poco atascado en este momento que cómo puedo usar el pivote en esta situación – Jaanna

+0

ejemplo de pivote proporcionado – tbone

Respuesta

11

Aquí es una forma de obtener los datos en el formato que desee:

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 

Ver SQL Fiddle with Demo

+0

Gracias, eso me ayudó :-) – Jaanna

+0

Buena solución para pivotar texto en Oracle 10g. – Tykin

44

PIVOT debería funcionar bien - SQL Fiddle demo (esquema tomado de bluefeets answer)

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

+1 No sabía que podría pivotar en dos columnas como esa. muy bueno – Taryn

+0

gracias ... esto fue bastante útil para aprender a pivotar dos columnas. – Jaanna

+0

Gracias. Estaba buscando este :) –

4

11gr2 Ejemplo de 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.