Problème sous SQL

BOB2015 Messages postés 6 Statut Membre -  
Morgothal Messages postés 1350 Statut Membre -
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,

4 réponses

  1. Morgothal Messages postés 1350 Statut Membre 184
     
    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
  2. BOB2015 Messages postés 6 Statut Membre
     
    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
  3. Morgothal Messages postés 1350 Statut Membre 184
     
    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
  4. BOB2015 Messages postés 6 Statut Membre
     
    Ré merci Clément c'est parfait, vous ne donnez pas des cours SQL du coup ?

    Bonne journée

    Bobo
    0
    1. Morgothal Messages postés 1350 Statut Membre 184
       
      Oh non je ne donne pas de cours, je ne suis vraiment pas assez calé pour ça :-)

      Bonnes fêtes
      0