J'ai des données au format pivoté. Cela ressemble à ceci:
-----------------------------------------
| 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 |
-----------------------------------------
J'aimerais que les données soient représentées comme:
-------------------------------------------------------------------------------------
| 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 |
-------------------------------------------------------------------------------------
Je pense qu'une requête pivot avec connexion par commande est nécessaire.
Voici ce que j'ai essayé de faire:
SELECT user_id,
org,
position,
lang,
ROW_NUMBER () OVER (PARTITION BY lang, user_id ORDER BY ROWID) rn
FROM source
Cependant, je ne sais pas comment aller de l'avant.
Voici un moyen d'obtenir les données au format souhaité:
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
Voir SQL Fiddle with Demo
PIVOT
devrait fonctionner correctement - SQL Fiddle demo (schéma emprunté à réponse 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)
);
Exemple PIVOT 11gr2
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.