Bonjour,
J'ai les données suivante dans une table :
Je souhaiterai désormais avoir mes données dans un seul champs en gardant le même ID :
ID CHAMPS V
1 5W40
1 10W40
1 5W30
1 10W50
Est-il possible de faire celà en SQL
Merci d'avance pour vos réponse
Bonjour,
J'ai les données suivante dans une table :
Je souhaiterai désormais avoir mes données dans un seul champs en gardant le même ID :
ID CHAMPS V
1 5W40
1 10W40
1 5W30
1 10W50
Est-il possible de faire celà en SQL
Merci d'avance pour vos réponse
Bonjour,
En utilisant des UNION c'est possible
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SELECT ID, V AS MyData FROM Matable UNION SELECT ID, V_1 AS MyData FROM MaTable UNION SELECT ID, V_2 AS MyData FROM MaTable UNION SELECT ID, V_3 AS MyData FROM MaTable
La solution classique à ce type de problème passe par la multiplication des enregistrements via un produit cartésien avec une table pivot puis le filtrage des colonnes en fonction du numéro d'ordre de la table pivot.
Puis à partir d'Oracle 11 cela a été simplifié via les instructions PIVOT/UNPIVOT
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 With Data As ( Select 1 as id, '5W40' V, '10W40' v_1, '5W30' v_2, '10W50' v_3 from dual ) Select id, Case pivot.x When 1 Then V When 2 Then V_1 When 3 Then V_2 When 4 Then V_3 End champ_v From data Cross join (Select level x from dual connect by level <= 4) pivot
Meric mnitu pour ta réponse.
J'ai essayé une autre requête, qui est la suivante (au cas où ça pourrais servir à qqln) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 with t as ( select '1' as ID, '5W40;10W40;10W50;5W30' as NORMES from DUAL ) select t.ID, x.column_value as NORMES from t cross join table( cast(multiset( select substr( ';'||NORMES||';', instr( ';'||NORMES||';', ';', 1, rownum )+1, instr( ';'||NORMES||';', ';', 1, rownum+1 ) -instr( ';'||NORMES||';', ';', 1, rownum )-1 ) from dual connect by level <= length(NORMES)-length(replace(NORMES,';',''))+1 ) as sys.odcivarchar2list ) ) x ORDER BY NORMES;
Désormais je souhaiterai mettre a jour une colonne qui s'appelle NORMESqui vient d'une table HUILE avec cette requête, cependant je ne sais pas du tout ou placer mon update dans cette requête.
Enfin je ne sais pas si j'étais clair..
Bonsoir,
tu ne peux faire un update puisque tu produiras plus de ligne qu'il n'y en a actuellement dans ta table... Tu peux insérer des nouvelles lignes et supprimer les originales...
Mais je dirais que le plus simple est de créer une table huile2, à partir de la ta table huile (puis si nécessaire de dropper l'ancienne table pour la remplacer par la nouvelle; attention a reverifier les contraintes au passage...) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22Create table HUILE2 Tablespace xxx as select t.ID, x.column_value as NORMES from HUILE t cross join table( cast(multiset( select substr( ';'||NORMES||';', instr( ';'||NORMES||';', ';', 1, rownum )+1, instr( ';'||NORMES||';', ';', 1, rownum+1 ) -instr( ';'||NORMES||';', ';', 1, rownum )-1 ) from dual connect by level <= length(NORMES)-length(replace(NORMES,';',''))+1 ) as sys.odcivarchar2list ) ) x ORDER BY NORMES; -- ensuite si necessaire : DROP TABLE HUILE; ALTER TABLE HUILE2 rename to HUILE;
Partager