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   -
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,
A voir également:

4 réponses

Morgothal Messages postés 1236 Date d'inscription   Statut Membre Dernière intervention   183
 
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)

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
0
BOB2015 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
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
0
Morgothal Messages postés 1236 Date d'inscription   Statut Membre Dernière intervention   183
 
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é ?

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


0
BOB2015 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Ré merci Clément c'est parfait, vous ne donnez pas des cours SQL du coup ?

Bonne journée

Bobo
0
Morgothal Messages postés 1236 Date d'inscription   Statut Membre Dernière intervention   183
 
Oh non je ne donne pas de cours, je ne suis vraiment pas assez calé pour ça :-)

Bonnes fêtes
0