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

MS SQL Server Discussion :

Formule colonne calculée


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 66
    Points
    66
    Par défaut Formule colonne calculée
    Salut,
    Voilà, j'ai une base de données sur SQL Server 2005 et j'ai une table (Projet) qui possède des champs calculés (ex : somme de montants d'une autre table). Avec l'aide je sais où taper ma formule (propriété Spécification de la colonne calculée). Cependant comme je n'ai jamais fait de formules, je ne sais pas quelle forme doit avoir la formule (comment dire que la colonne est une somme d'autres colonnes d'une table...).
    Si vous pouviez m'aider. Merci.

  2. #2
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    La formule d'une colonne calculée ne peut pas référencer les colonnes d'une autre table. Tu pourrais sans doute contourner cela en créant une fonction qui va chercher les données où tu veux, mais je te le déconseille fortement car tu t'exposes à des problèmes de performances.

    La meilleure solution est de créer une vue.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 66
    Points
    66
    Par défaut
    Désolé d'avoir fait un autre post, mais je voulais être plus général dans ma question.
    Pour la référence à d'autres tables dans une formule, ok c'est impossible merci.
    Tu me propose d'utiliser des vues. J'ai cependant un problème :
    Par exemple :
    J'ai 2 tables : Projet(nomP, montantTTCP) et Devis(nomD, dateD, montantTTCD). 1 devis a 1 projet, 1 projet peut avoir N devis.
    Je souhaite que montantTTCP soit la somme des montantTTCD associés.
    Si je fais une vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE VIEW montantTTCP
    AS SELECT sum(d.montantTTCD) as total 
    FROM devis d, projet p
    WHERE d.nomP=p.nomP
    Le problème, c'est qu'il me faudrait un : AND p.nomP=...
    Mais je ne connais pas le nomP.

    Si vous pouvez m'aider. Et si tu peux me dire comment faire avec des fonctions, même si c'est lourd, je pense que ça correspond plus à ce que je veux.

  4. #4
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Salut,

    Ma suggestion de la vue, est pour remplacer la table + la colonne calculée.
    La vue donnant qqch comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE VIEW dbo.vProjet
    AS SELECT p.nomP /* ... */ ,sum(d.montantTTCD) as montantTTCDtotal
    FROM dbo.devis d
    JOIN dbo.projet p ON d.nomP=p.nomP
    Ensuite, tu peux faire des requêtes SELECT sur cette vue au lieu de le faire sur la table. Cela permettra à l'optimiseur de SQL Server de bien se débrouiller.
    A moins que tu souhaites stocker en dur la somme dans une colonne de Projet, ce que je déconseile à moins que tu aies de vrais problèmes de performances. Dans ce cas, tu peux le faire à l'aide d'un trigger sur Devis
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 66
    Points
    66
    Par défaut
    Quand tu parlais d'utiliser des fonctions, est-ce que c'est la même chose que lorsque tu parles des triggers ?

  6. #6
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Ce sont deux choses différentes.
    Que souhaites-tu faire précisément ?
    1) afficher un total dans une requête de type SELECT
    2) stocker le total dans une colonne d'une table, pour améliorer tes performances ?
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  7. #7
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 66
    Points
    66
    Par défaut
    La 2eme, je souhaite stocker le total.

  8. #8
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    D'accord, donc tu es prêt à accepter dans le contrat les problèmes de maintenance de la valeur de la colonne qui vont avec ?

    Tu peux le faire avec un trigger sur ta table Devis. Le trigger (déclencheur), est un bloc de code qui s'exécute à chaque modification des enregistrements de la table. Cela te permettra de mettre à jour le total dans la table Projet chaque fois qu'il y aura une modification dans les montants de la table Devis.
    Regarde CREATE TRIGGER dans l'aide en ligne.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  9. #9
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 66
    Points
    66
    Par défaut
    Ok merci je vais regarder ça mais que veux tu dire par problème de maintenance si le trigger met le montant à jour s'il y a une modification ?

  10. #10
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    pessimisme habituel... Un trigger désactivé, une modification faite à la main dans le total, un oubli. Aussi les éventuelles questions de performance.
    Rien de grave sans doute si c'est maîtrisé.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  11. #11
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 66
    Points
    66
    Par défaut
    Génial ça marche, j'ai fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TRIGGER TriggerInsertMontantP
    ON DEVIS
    FOR INSERT
    AS
    UPDATE PROJET SET MONTANTTTCP=MONTANTTTCP+(SELECT MONTANTTTCD FROM inserted) WHERE NOMP=(SELECT NOMP FROM inserted)
    GO
    Cependant, j'ai un problème.
    Lorsqu'un devis est créé, si le montantD n'est pas renseigné, sa valeur reste à NULL, et avec mon trigger, ça ne marche pas (on ne peut pas ajouter à une valeur Null).
    Il faudrait donc que j'ai un update du genre : montantTTCP=(Select montantTTCD from inserted), si la valeur est à null.
    Comment est-ce que je peux tester la valeur de mon montantTTCP ?
    J'ai essayé avant le update : IF PROJET.montantTTCP=null mais j'ai cette erreur :
    L'identificateur en plusieurs parties 'DEVIS.MONTANTTTCD' ne peut pas être lié.

  12. #12
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    ... et que se passe-t-il si une ligne de Devis est supprimée ? ou mise à jour ?
    et si l'INSERT ajoute plusieurs lignes avec des NomP différents ? Que va faire cette partie : WHERE NOMP=(SELECT NOMP FROM inserted) ... elle va calculer des données erronées.

    C'est en cela que je disais qu'il faut maîtriser toutes les possibilités.

    Une proposition (non testée) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE TRIGGER TriggerInsertMontantP
    ON DEVIS
    FOR INSERT, UPDATE, DELETE
    AS
    	IF @@ROWCOUNT = 0 RETURN
     
    	UPDATE p
    	SET MONTANTTTCP = (SELECT SUM(MONTANTTTCD) FROM dbo.Devis d WHERE d.NomP = p.NomP)
    	FROM dbo.projet p
    	JOIN (SELECT NomP FROM inserted UNION SELECT NomP FROM deleted) t ON p.NomP = t.NomP
    GO
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  13. #13
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 66
    Points
    66
    Par défaut
    Je n'ai pas encore testé la suppression et la mise à jour, je préfère avancer pas à pas.
    Si tu parles du Insert de Devis, il n'y a l'ajout que d'1 ligne avec 1 nomP.
    Sinon pour ta proposition, je vais tester merci.

  14. #14
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 66
    Points
    66
    Par défaut
    Un grand merci rudib, ta proposition marche parfaitement.
    J'espère ne plus avoir de question.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. table avec des colonnes calculées (table qui stocke des formules)
    Par messi1987 dans le forum Développement
    Réponses: 15
    Dernier message: 13/01/2014, 17h16
  2. Réponses: 11
    Dernier message: 13/04/2013, 15h25
  3. [SP-2007] Formule Colonne valeur calculée : test date non renseignée
    Par SONY30 dans le forum SharePoint
    Réponses: 3
    Dernier message: 30/08/2010, 11h41
  4. Mauvais résultat aprés une formule de calcul complexe
    Par poufouille dans le forum Bases de données
    Réponses: 3
    Dernier message: 10/12/2004, 00h12
  5. [CR] Colonnes calculées
    Par plong dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 23/11/2003, 12h12

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