|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Controleur de Gestion Inscription : août 2011 Messages : 3 ![]() |
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 |
|
|
00
|
|
|
#2 | ||||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Bonjour,
Le problème c'est que l'ordre en SQL n'existe pas, donc il vous faut en créer un artificiellement. Ensuite la modélisation de votre entité est fausse, puisque les valeurs des attributs (ce que vous appelez cellule en référence à Excel En ce sens, il aurait donc mieux valu créer une table compte_info_type qui contiendrait seulement quatre tuples (lignes) : InfoA1, InfoA2, InfoB1, InfoC1. Ajouter à cela une table compte_info qui référence par clé étrangère la table des comptes et la table compte_info_type, avec une colonne supplémentaire pour stocker la valeur de l'info. Ce qui explique ceci : Citation:
Citation:
Dans ce second cas, elle est à NULL, NULL en SQL n'étant pas une valeur, mais un marqueur qui signifie l’absence de valeur pour une colonne d'une ligne particulière. En ce qui concerne la piste que vous avez explorée, sachez que les curseurs sont à proscrire autant que cela est possible. D'ailleurs un article de SQLPro y est consacré, et j'ai ai moi-même consacré un billet. Mais on va néanmoins tenter de suivre votre démarche : est-ce que la requête suivante : Code :
@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||||
|
00
|
|
|
#3 |
|
Invité de passage
![]() Controleur de Gestion Inscription : août 2011 Messages : 3 ![]() |
Merci pour cette réponse rapide, et pédagogique : Oui, c'est bien l'ordre que je veux !
![]() PS: Pour la modélisation de mon entité, tu as raison |
|
|
00
|
|
|
#4 | ||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Citation:
![]() Plus vous serez strict sur votre modélisation, moins vous passerez de temps à écrire le code et à le maintenir ! Citation:
@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||
|
00
|
|
|
#5 |
|
Invité de passage
![]() Controleur de Gestion Inscription : août 2011 Messages : 3 ![]() |
Oui, la requête testé me permet d'obtenir un ordre comme je le souhaite et [indice] est OK. Merci.
Cependant ma curiosité demeure : comment se servir de cet indice pour copier le contenu d'une partie des attributs de la ligne L-1 dans la ligne L de chaque Compte. Ci-joint un récap schématique fait sous Excel pour ce que j'ai et ce que je voudrais obtenir. Merci ! WZM |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com