Problème sous SQL
BOB2015
Messages postés
6
Date d'inscription
Statut
Membre
Dernière intervention
-
Morgothal Messages postés 1236 Date d'inscription Statut Membre Dernière intervention -
Morgothal Messages postés 1236 Date d'inscription Statut Membre Dernière intervention -
Bonjour
J'ai la table table source suivante dans une base SQL.
CODE R LIB CODES ASSO FORMULA
R001 XXX A02;A03;A04;A05 +CA*CHG*1-TX
R002 YYY A02;A03;A04;A05 +CA*CHG*1-TOTO
R003 ZZZ A07 +CHG*1-TOTO
R004 UUU A10 +CHG*1-TOTO
Mais j'aimerais en sortie le résultat suivant :
CODE R LIB CODES ASSO FORMULA
R001 XXX A02 +CA*CHG*1-TX
R001 XXX A03 +CA*CHG*1-TX
R001 XXX A04 +CA*CHG*1-TX
R001 XXX A05 +CA*CHG*1-TX
R002 YYY A02 +CA*CHG*1-TOTO
R002 YYY A03 +CA*CHG*1-TOTO
R002 YYY A04 +CA*CHG*1-TOTO
R002 YYY A05 +CA*CHG*1-TOTO
R003 ZZZ A07 +CHG*1-TOTO
R004 UUU A10 +CHG*1-TOTO
Mais je ne vois pas trop comment récupérer les valeurs de cellules en ligne.
Sur la première ligne par exemple le CODES ASSO est égal à A02 ; A03 ; A04 ; A05 et je dois récupérer autant des lignes qu'il y a des codes et bien évidement les associer avec la colonne CODE R.
Il faut que cela soit absolument fait en SQL, connaissez vous une fonction qui pourrait m'aider à récupérer les CODES ASSO qui sont séparés par « ; » et ensuite les récupérer en ligne ? Comment expliqué dans l'exemple précédent ?
D'avance je vous remercie,
J'ai la table table source suivante dans une base SQL.
CODE R LIB CODES ASSO FORMULA
R001 XXX A02;A03;A04;A05 +CA*CHG*1-TX
R002 YYY A02;A03;A04;A05 +CA*CHG*1-TOTO
R003 ZZZ A07 +CHG*1-TOTO
R004 UUU A10 +CHG*1-TOTO
Mais j'aimerais en sortie le résultat suivant :
CODE R LIB CODES ASSO FORMULA
R001 XXX A02 +CA*CHG*1-TX
R001 XXX A03 +CA*CHG*1-TX
R001 XXX A04 +CA*CHG*1-TX
R001 XXX A05 +CA*CHG*1-TX
R002 YYY A02 +CA*CHG*1-TOTO
R002 YYY A03 +CA*CHG*1-TOTO
R002 YYY A04 +CA*CHG*1-TOTO
R002 YYY A05 +CA*CHG*1-TOTO
R003 ZZZ A07 +CHG*1-TOTO
R004 UUU A10 +CHG*1-TOTO
Mais je ne vois pas trop comment récupérer les valeurs de cellules en ligne.
Sur la première ligne par exemple le CODES ASSO est égal à A02 ; A03 ; A04 ; A05 et je dois récupérer autant des lignes qu'il y a des codes et bien évidement les associer avec la colonne CODE R.
Il faut que cela soit absolument fait en SQL, connaissez vous une fonction qui pourrait m'aider à récupérer les CODES ASSO qui sont séparés par « ; » et ensuite les récupérer en ligne ? Comment expliqué dans l'exemple précédent ?
D'avance je vous remercie,
A voir également:
- Problème sous SQL
- Logiciel sql - Télécharger - Bases de données
- Requete sql pix - Forum PHP
- Additions et multiplication dans des requêtes SQL ✓ - Forum MySQL
- Sql query download - Télécharger - Gestion de données
- Ora-00933: la commande sql ne se termine pas correctement ✓ - Forum Oracle
4 réponses
Bonjour !
Voilà j'ai trouvé :) ça fait depuis ce matin 11h que je cherche, j'ai pas été très rapide...
Voilà la requête à exécuter jusqu'à ce qu'il y ait affiché "Commande réussie" à la place de "1 ligne(s) affectée(s)" :
(La table CSD_TEMP1 correspond à ta table source)
Désolé pour la casse un peu pourrie et l'indentation à jeter à la poubelle :/
Je suis a dispo si besoin !
-------------------
Cordialement,
Clément
Voilà j'ai trouvé :) ça fait depuis ce matin 11h que je cherche, j'ai pas été très rapide...
Voilà la requête à exécuter jusqu'à ce qu'il y ait affiché "Commande réussie" à la place de "1 ligne(s) affectée(s)" :
(La table CSD_TEMP1 correspond à ta table source)
declare @id int declare @code_r nvarchar (50) declare @lib nvarchar (50) declare @code nvarchar (50) declare @formula nvarchar (50) declare @iteration int DECLARE db_cursor CURSOR FOR SELECT id FROM csd_temp1 OPEN db_cursor FETCH NEXT FROM db_cursor INTO @id WHILE @@FETCH_STATUS = 0 BEGIN set @code_r = (select code_r from CSD_TEMP1 where ID = @id) set @lib = (select lib from CSD_TEMP1 where ID = @id) set @code = (select codes_asso from CSD_TEMP1 where ID = @id) set @formula = (select formula from CSD_TEMP1 where ID = @id) set @iteration = (select MAX(id) from CSD_TEMP1) if len(@code)>3 begin insert into CSD_TEMP1 values (@iteration+1,@code_r,@lib,left(@code,3),@formula) set @code = RIGHT(@code,len(@code)-4) update csd_temp1 set CODES_ASSO = @code where ID = @id end FETCH NEXT FROM db_cursor INTO @id END CLOSE db_cursor DEALLOCATE db_cursor
Désolé pour la casse un peu pourrie et l'indentation à jeter à la poubelle :/
Je suis a dispo si besoin !
-------------------
Cordialement,
Clément
Bonjour Clément merci bp cela marche parfaitement, mais vous savez je découvre un peu le SQL et j'aurais besoin d'exécuter en une seule fois la commande, est-ce que vous savez ce que je pourrais faire pour l'exécuter en une seule fois ?
Merci d'avance,
Bob Peterson
Merci d'avance,
Bob Peterson
Rebonjour,
Voilà le code qui n'a besoin d'être exécuté qu'une seule fois.
Note : J'ai rajouté une colonne ID incrémentée pour pouvoir identifier les lignes. Cette colonne ID peut être rajoutée au début du traitement et être supprimée à la fin, je ne sais pas s'il y a besoin de le faire vu que le code posté ici a fonctionné ?
Voilà le code qui n'a besoin d'être exécuté qu'une seule fois.
Note : J'ai rajouté une colonne ID incrémentée pour pouvoir identifier les lignes. Cette colonne ID peut être rajoutée au début du traitement et être supprimée à la fin, je ne sais pas s'il y a besoin de le faire vu que le code posté ici a fonctionné ?
declare @id int declare @code_r nvarchar (50) declare @lib nvarchar (50) declare @code nvarchar (50) declare @formula nvarchar (50) declare @iteration int declare @compteur int declare @nblignes int set @nblignes = (select MAX(id) from CSD_TEMP1) set @compteur = 1 WHILE @compteur<=@nblignes BEGIN DECLARE db_cursor CURSOR FOR SELECT id FROM csd_temp1 OPEN db_cursor FETCH NEXT FROM db_cursor INTO @id WHILE @@FETCH_STATUS = 0 BEGIN set @code_r = (select code_r from CSD_TEMP1 where ID = @id) set @lib = (select lib from CSD_TEMP1 where ID = @id) set @code = (select codes_asso from CSD_TEMP1 where ID = @id) set @formula = (select formula from CSD_TEMP1 where ID = @id) set @iteration = (select MAX(id) from CSD_TEMP1) if len(@code)>3 begin insert into CSD_TEMP1 values (@iteration+1,@code_r,@lib,left(@code,3),@formula) set @code = RIGHT(@code,len(@code)-4) update csd_temp1 set CODES_ASSO = @code where ID = @id end FETCH NEXT FROM db_cursor INTO @id END CLOSE db_cursor DEALLOCATE db_cursor set @compteur = @compteur + 1 END