Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/08/2011, 18h30   #1
Invité de passage
 
Homme
Controleur de Gestion
Inscription : août 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

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

Informations forums :
Inscription : août 2011
Messages : 3
Points : 0
Points : 0
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
wazupman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 15h40   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
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 :

Citation:
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é.

Citation:
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 :
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 ?

@++
__________________
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
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 09h03   #3
Invité de passage
 
Homme
Controleur de Gestion
Inscription : août 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

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

Informations forums :
Inscription : août 2011
Messages : 3
Points : 0
Points : 0
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...
wazupman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 17h56   #4
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Citation:
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 !

Citation:
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 ?

@++
__________________
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
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 01h25   #5
Invité de passage
 
Homme
Controleur de Gestion
Inscription : août 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

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

Informations forums :
Inscription : août 2011
Messages : 3
Points : 0
Points : 0
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
Type de fichier : xls Table pour transformation.xls (59,5 Ko, 4 affichages)
wazupman est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h44.


 
 
 
 
Partenaires

Hébergement Web