I have data in pivoted format. It looks like this:
-----------------------------------------
| user_id | org | position | lang |
----------------------
Here is a way to get the data in the format you want:
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
See SQL Fiddle with Demo
11gr2 PIVOT example
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.
PIVOT
should work fine - SQL Fiddle demo (schema borrowed from 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)
);