Problème sous SQL

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. 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
    1. 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
      1. 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
        1. Ré merci Clément c'est parfait, vous ne donnez pas des cours SQL du coup ?

          Bonne journée

          Bobo
          0
          1. Oh non je ne donne pas de cours, je ne suis vraiment pas assez calé pour ça :-)

            Bonnes fêtes
            0