IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Copier certaines valeurs de ligne L-1 dans ligne L (en TRANSACT-SQL ou en SQL)


Sujet :

Développement SQL Server

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Controleur de Gestion
    Inscrit en
    Août 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Controleur de Gestion
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Copier certaines valeurs de ligne L-1 dans ligne L (en TRANSACT-SQL ou en SQL)
    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

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    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 ) ne dépendent pas directement de la clé primaire de la table qui représente l'entité.

    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 :

    Je bloque dans l'étape finale de construction d'une table de dimension changeante.
    Dès lors que votre modélisation est correcte, il vous aurait suffit d'ajouter un tuple dans compte_info_type et le tour était joué.

    de format Datetime est vide pour l'instant.
    En SQL, une colonne n'est jamais vide : elle a une valeur, ou elle n'en a pas.
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT	Compte
    	, RecordBeginDateHeure
    	, NameRecord
    	, ROW_NUMBER() OVER(PARTITION BY Compte ORDER BY Compte, RecordBeginDateHeure) AS indice
    FROM	dbo.maTable
    correspond à l'ordre que vous souhaitez obtenir pour chaque compte ?

    @++

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Controleur de Gestion
    Inscrit en
    Août 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Controleur de Gestion
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    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 . En l'état elle est fausse : j'avais prévu de créer ma clé primaire (auto incrémentée) à l'issue de la programmation en TSQL...

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    j'avais prévu de créer ma clé primaire (auto incrémentée) à l'issue de la programmation en TSQL...
    C'est exactement l'inverse qu'il faut faire
    Plus vous serez strict sur votre modélisation, moins vous passerez de temps à écrire le code et à le maintenir !

    Oui, c'est bien l'ordre que je veux !
    C'est-à-dire : est-ce que vous avez exécuté la requête que je vous ai donné, et est-ce qu'elle vous donne l'ordre que vous recherchez ?

    @++

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Controleur de Gestion
    Inscrit en
    Août 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Controleur de Gestion
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    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
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/11/2008, 10h36
  2. Réponses: 3
    Dernier message: 30/09/2008, 12h53
  3. Réponses: 3
    Dernier message: 29/07/2008, 09h56
  4. Réponses: 6
    Dernier message: 25/11/2007, 17h59
  5. Réponses: 3
    Dernier message: 21/05/2007, 12h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo