[SQL Server 2005] Demande de Brainstorming [Résolu]

Signaler
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012
-
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012
-
Bonjour à tous,

Supposons que j'ai une table temporaire créée et remplie comme suit :

 DECLARE @__TableTemps TABLE 
  ( nom       char(1)
  , priorite  int
  , temps     int
  )

  insert into @__TableTemps values( 'A', 1, 10 )
  insert into @__TableTemps values( 'B', 2, 15 )
  insert into @__TableTemps values( 'C', 3, 10 )
  insert into @__TableTemps values( 'D', 4, 12 )
  insert into @__TableTemps values( 'E', 5,  8 )
  insert into @__TableTemps values( 'F', 6, 18 )
  insert into @__TableTemps values( 'G', 7,  2 )
  insert into @__TableTemps values( 'H', 8,  3 )
  insert into @__TableTemps values( 'I', 9,  9 )


J'aurais besoin de créer une seconde table dynamique selon les critères suivants:
[list]* Ajout d'autant de colonnes qu'il y a de lignes dans la table précédente.
* Et chaque colonne contiendra la somme du temps de la ligne en cours avec les précédentes lignes./list
Au final la nouvelle table ressemblera à:
Nom  priorite  Temps  ColA      ColB       ColC      ColD      ColE ColF ColG ColH ColI 
A    1         10     0         0          0         0         0    0    0    0    0    
B    2         15     15+10=25  0          0         0         0    0    0    0    0    
C    3         10     10+10=20  10+15=25   0         0         0    0    0    0    0    
D    4         12     12+10=22  12+15=27   12+10=22  0         0    0    0    0    0    
E    5          8      8+10=18   8+15=23    8+10=18  8+12=20   0    0    0    0    0    
F    6         18     etc...
G    7          2     
H    8          3     
I    9          9     

J'aurais juste besoin d'un petit brainstorming, sur la meilleure manière à employer pour réaliser cela en SQL.

Merci d'avance pour vos contributions.

Cordialement.[hr]"L'imagination est plus importante que le savoir." Albert Einstein

3 réponses

Messages postés
219
Date d'inscription
mercredi 26 octobre 2011
Statut
Membre
Dernière intervention
22 juin 2017
9
Bonjour,

A mon avis tu dois passer par un curseur sur ta table @__TableTemps
et ensuite utiliser du sql dynamique pour ajouter tes colonnes

c'est le plus simple que j'ai imaginé.


DECLARE @__TableTemps TABLE 
  ( nom       char(1)
  , priorite  int
  , temps     int
  )
  insert into @__TableTemps values( 'A', 1, 10)
  insert into @__TableTemps values( 'B', 2, 15)
  insert into @__TableTemps values( 'C', 3, 10)
  insert into @__TableTemps values( 'D', 4, 12)
  insert into @__TableTemps values( 'E', 5,  8)
  insert into @__TableTemps values( 'F', 6, 18)
  insert into @__TableTemps values( 'G', 7,  2)
  insert into @__TableTemps values( 'H', 8,  3)
  insert into @__TableTemps values( 'I', 9,  9)


DECLARE @cols varchar(2000) --- this could be an imput parameter

declare @nom char(1)
declare @priorite  int
declare @temps     int
declare @prevTemps int

set @prevTemps = 0
select * into #tmp from @__TableTemps

declare @sql varchar(2000)
declare @col varchar(2000)


DECLARE curseur CURSOR FOR 
select
nom,priorite,temps
from
    @__TableTemps
order by priorite

OPEN curseur;

FETCH NEXT FROM curseur 
INTO @nom,@priorite,@temps;

WHILE @@FETCH_STATUS = 0
BEGIN
select @prevTemps temps from @__TableTemps where nom @nom

select @sql = 'ALTER TABLE #tmp ADD col' + @nom + ' int null'
exec(@sql)

select @sql 'update #tmp set col' + @nom + ' 0'
exec(@sql)

select @sql 'update #tmp set col' + @nom + ' temps + ' + convert(varchar(10),@prevTemps) + ' where priorite > ' + CONVERT(varchar(10),@priorite) 
exec(@sql)

FETCH NEXT FROM curseur 
INTO @nom,@priorite,@temps;

END
CLOSE curseur;
DEALLOCATE curseur;

select * from #tmp

drop table #tmp



Bonne journée





Faites simple, aussi simple que possible, mais pas simpliste.
A. Einstein.
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012
2
bonjour

@ cgandco : Merci pour ta réponse et surtout pour le temps passé à coder (je n'en demandai d'ailleurs pas autant).
Je regarderai plus en détail tout cela lundi, fêtes de fin d'année obligent...

@ tous les autres : Je suis toujours preneur pour d'autres propositions, c'est au départ un bainstroming

Cordialement.[hr]"L'imagination est plus importante que le savoir." Albert Einstein
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012
2
Bonjour

@ cgandco : J'attends vendredi, au plus tard, pour valider ta réponse (histoire de laisser le post ouvert aux éventuels retardataires de début d'année).

Cordialement.[hr]"L'imagination est plus importante que le savoir." Albert Einstein