Problème sous SQL

Fermé
BOB2015 Messages postés 6 Date d'inscription mercredi 26 décembre 2012 Statut Membre Dernière intervention 22 juillet 2013 - 26 déc. 2012 à 10:00
Morgothal Messages postés 1236 Date d'inscription jeudi 22 avril 2010 Statut Membre Dernière intervention 19 mai 2015 - 28 déc. 2012 à 16:11
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 jeudi 22 avril 2010 Statut Membre Dernière intervention 19 mai 2015 183
Modifié par Morgothal le 26/12/2012 à 14:24
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 mercredi 26 décembre 2012 Statut Membre Dernière intervention 22 juillet 2013
26 déc. 2012 à 15:33
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 jeudi 22 avril 2010 Statut Membre Dernière intervention 19 mai 2015 183
26 déc. 2012 à 16:22
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 mercredi 26 décembre 2012 Statut Membre Dernière intervention 22 juillet 2013
28 déc. 2012 à 16:06
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 jeudi 22 avril 2010 Statut Membre Dernière intervention 19 mai 2015 183
28 déc. 2012 à 16:11
Oh non je ne donne pas de cours, je ne suis vraiment pas assez calé pour ça :-)

Bonnes fêtes
0