Bonjour,
Je découvre SQL SERVER 2008 et le T SQL...
Je bloque dans l'étape finale de construction d'une table de dimension changeante.
Je veux donc passer à de la programmation en TRANSACT SQL.
STRUCTURE DE TABLE
Grossièrement ma table se présente ainsi (7 colonnes, triée sur les 2 premiers attributs, en ordre croissant) :
[Compte] [RecordBeginDateHeure] [NameRecord] [InfoA1] [InfoA2] [InfoB1] [InfoC1] [RecordEndDateHeure] [IndicEndCompte]
CONTENU ACTUEL DE MA TABLE :
1-Un même [Compte] a un ou plusieurs [RecordDateHeure] strictement différents (cela permet de suivre à la trace l'évolution du compte)
2- Le [RecordBeginDateHeure] donne en format Datetime le moment exact de la transaction
3-A chaque [RecordBeginDateHeure] correspond un [NameRecord] qui ne peut prendre que 3 valeurs textuelles ("A", "B", "C")
4-A chaque valeur textuelle de [NameRecord] correspond une description qui se fait :
* dans 2 attributs [InfoA1] [InfoA2] pour la valeur "A"
* dans 1 attribut [InfoB1] pour la valeur "B"
* dans 1 attribut [InfoC1] pour la valeur "C"
5- L'attribut [RecordEndDateHeure] de format Datetime est vide pour l'instant.
6- L'attribut [RecordEndDateHeure] de format Boolean est vide pour l'instant.
-> de fait cette table a des "cellules" vides pour les attributs [InfoA1] [InfoA2] [InfoB1] [InfoC1] [RecordEndDateHeure] [IndicEndCompte]
LA PROBLEMATIQUE : CONTENU FINAL SOUHAITE
Je voudrais compléter cette table par un code TRANSACT-SQL selon la règle suivante :
Règle de base : Modifier uniquement une ligne de [Compte] si un N° Compte a plus qu'une ligne de transaction.
Les traitements que je souhaite faire :
1- Pour les attributs [InfoA1] [InfoA2] [InfoB1] [InfoC1] :
A la ligne L, pour une valeur de [Compte] donné, je complète chaque "cellule" qui est vide (valeur d'attribut non renseigné) par la valeur de la "cellule" de la ligne L-1 (du même attribut)
2- Pour les attributs [RecordEndDateHeure] et [IndicEndCompte] :
- A la ligne L
* Si ce n'est pas la dernière ligne d'enregistrement pour le [Compte] donné, je récupère dans [RecordEndDateHeure] la valeur de [RecordBeginDateHeure]-1seconde de la ligne L+1 ET je mets [IndicEndCompte] à 0 (faux)
* Si c'est la dernière ligne d'enregistrement pour le [Compte] donné, je mets dans [RecordEndDateHeure] la valeur 31/12/2050 00:00 ET je mets [IndicEndCompte] à 1 (vrai)
UNE PISTE EXPLOREE
J'ai trouvé dans un article de Sqlpro une piste qui serait l'utilisation des curseurs ("Petit guide de Transact SQL") et aussi l'article très intéressant de mise en garde ("Éviter les curseurs sous Microsoft SQL Server").
J'ai ainsi pu faire des scripts simple, mais je n'y arrive pas...
D'avance merci pour l'aide,
WZM
Partager