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 :

Est-il possible de réaliser un champ calculé ?


Sujet :

MS SQL Server

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Par défaut Est-il possible de réaliser un champ calculé ?
    Bonjour,

    J'ai 2 tables (Intervention et Client) et je souhaiterais savoir s'il est possible d'avoir un champ qui calcul le nombre d'intervention dans la table client c'est à dire le nombre d'intervention effectué par client ??

    J'espère être clair dans mon explication.

    Merci d'avance!

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Par défaut
    Tu peux résoudre cela en utilisant un trigger sur ta table des interventions qui pour chaque insert/update/delete mettrait à jour une colonne [Nombre d'intervention] sur ta table des clients. Mais n'est ce pas un peu redondant ?

    Pourquoi ne pas créer une vue qui, en complément des colonnes de la table client, ajouterait à une colonne COUNT(*) sur la table intervention groupée par client ?

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Par défaut réponse à Erwan1978
    Merci pour ta réponse Erwan1978.

    J'avais pas pensé au trigger, pourquoi pas.

    Mais je n'ais pas compris ta deuxième phrase : "Pourquoi ne pas créer une vue qui, en complément des colonnes de la table client, ajouterait à une colonne COUNT(*) sur la table intervention groupée par client ? "

    Peux tu me l'expliquer s'il te plais ??

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Par défaut
    Un exemple valant toujours mieux qu'un discours...

    On a les tables Clients et Interventions liées par la colonne ClientId :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE clients
    	(clientid INT NOT NULL PRIMARY KEY,
    	ClientName VARCHAR(50) NOT NULL)
    GO
    CREATE TABLE interventions
    (interId INT NOT NULL PRIMARY KEY,
    interType VARCHAR(25) NOT NULL,
    ClientId INT NOT NULL)
     
    GO
    ALTER TABLE interventions ADD CONSTRAINT FK_interventions_clients FOREIGN KEY(ClientId) REFERENCES clients(clientid)
    On leur ajoute quelques enregistrements :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    INSERT INTO clients
    (ClientId,ClientName)
    SELECT 1,'Claude'
    UNION SELECT 2,'Pierre'
    UNION SELECT 3,'Jacques'
    UNION SELECT 4,'Marion'
    UNION SELECT 5,'Stephanie'
    UNION SELECT 6,'Frederic'
     
    INSERT INTO interventions
    (interid,intertype,clientid)
    SELECT 1,'Depannage',1
    UNION SELECT 2,'Conseil',1
    UNION SELECT 3,'Depannage',1
    UNION SELECT 4,'Tuning',2
    UNION SELECT 5,'Conseil',2
    UNION SELECT 6,'Tuning',4
    UNION SELECT 7,'Depannage',4
    UNION SELECT 8,'Depannage',5
    On crée ensuite la vue qui reprend les colonne de la table Clients et qui lui ajoute une colonne de decompte du nombre d'interventions par client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE VIEW client_inter
     
    AS
     
    	SELECT C.ClientId,C.ClientName,COUNT(I.clientID) AS Nb_Interventions
    	FROM Clients C
    		LEFT JOIN interventions I ON C.ClientID=I.ClientID
    	GROUP BY C.ClientId,C.ClientName
    On contrôle le tout :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT ClientId,ClientName,Nb_Interventions
    FROM client_inter

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Par défaut réponse à Erwan1978
    Ok, je comprend mieux maintenant.

    Mais je viens de voir la case "formules" situé en bas à gauche et je me demande si je peux pas mettre une formule 'COUNT(Intervention.clientId)'??

    Qu'en penses-tu??

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 986
    Billets dans le blog
    6
    Par défaut
    4 possibilités :
    1) colonne calculée en ligne : pas possible dans votre cas car calcul d'agrégat
    2) colonne calculée par trigger : possible dans votre cas
    3) vue SQL
    4) option d'indexation pour la colonne calculée ou la vue.

    Tout dépend si vous voulez instancier le calcul ou le laisser en calcul à l'exécution.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Par défaut
    Je connais mal les colonnes calculées, mais je crois savoir qu'il n'est pas possible de faire appel à des colonnes externes (celles d'interventions) dans la definition de ta colonne calculée (celle de Clients).

    Un post sur ce forum résume ceci ainsi que les solutions beaucoup plus clean.

    Par ailleurs, en terme de performance, les colonnes calculées sont assez desastreuse à en croire les tests...

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Par défaut
    Je viens d'essayer de réaliser la création de la vue mais problème, lorsque je veux enregistrer il m'affiche le message d'erreur suivant :
    ---------------------------
    SQL Server Enterprise Manager
    ---------------------------
    Erreur ODBC*: [Microsoft][ODBC SQL Server Driver][SQL Server]'dbo.Clients' : nom d'objet incorrect.

    [Microsoft][ODBC SQL Server Driver][SQL Server]'dbo.interventions' : nom d'objet incorrect.


    ---------------------------
    OK Aide
    ---------------------------
    Pourriez-vous m'aider à résoudre ce problème car je comprend pas du tout ce qu'il veux dire donc comment le résoudre.

    Merci d'avance!

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Par défaut
    Désolé je vous ai dérangé pour rien, je viens tous juste de trouver mon erreur, c'est juste que le nom des tables n'étais pas bon, au lieu de 'Clients' c'est 'Client'.
    Vraiment une erreur bête!!LOL

    Par contre Erwan1978, lorsque dans une précédente réponse, tu me dit :
    On contrôle le tout :


    Code :

    SELECT ClientId,ClientName,Nb_Interventions
    FROM client_inter
    Comment je dois faire cela??
    Puis y-a t'il une possibilité pour que le nombre des interventions s'affichent dans la table Client ?? car là le nombre des interventions s'affichent dans la vue.

    Merci d'avance

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Par défaut
    Pour t'aider, il faut que tu publies le code de tes tables Clients et Interventions ainsi que celui de la vue que tu essaies de créer.

    Pour rappel ; tu obtiens le code SQL de tes objets de différentes manières. Le plus rapide est sans doute d'ouvrir l'analyseur de requête et a partir de l'explorateur d'objets, fais un clic droit sur ta table et 'Modifier'. Fais de même pour l'autre table.

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Par défaut
    Puis y-a t'il une possibilité pour que le nombre des interventions s'affichent dans la table Client ?? car là le nombre des interventions s'affichent dans la vue.
    Pas avec cette solution, le decompte s'affiche dans la vue. Si tu veux qu'elle s'affiche dans la table alors ajoute une colonne dans ta table client et aliment la avec un trigger placé sur la table des interventions

    ++

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Par défaut réponse à Erwan1978
    Merci pour tes réponses, super moi et les triggers ca fait 15!!LOL.
    Enfin je vais essayer quand même si j'ai pas le choix!!LOL.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Par défaut
    Désolé Erwan1978 mais je voudrais savoir s'il es possible que tu m'envoye un exemple de trigger (avec explication si possible sinon pas grave) pour m'aider car la franchement je vois pas comment faire.

    En fait je commence tout juste mon stage (je suis en 2éme année de BTS informatique de gestion) et on a vu les triggers un ti peu avant les vacances mais je n'y arrivé pas bien du tout!!

    Merci d'avance et désolé de te déranger car je suppose que t'as autre chose à faire.

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Par défaut
    Avant de te lancer dans le code, je te recommande de lire un peu de documentation : http://sql.developpez.com/sqlserver/transactsql/

    Le chapitre 5 devrait t'interesser particulièrement

    Par ailleurs, si tu veux une aide vraiment efficace ; poste le code de tes objets (tables en l'occurence) ça rends les exemple plus parlant.

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Par défaut réponse à Erwan1978
    Ben tkt je suis déja sur la documentation mais j'ai du mal quand même, ça n'empéche.

    Par contre je n'ai pas encore effectué de liaison entre les tables car j'ai un problème de taille de type de donnée(comme je l'ai inséré dans un sujet de ce site que j'ai réaliser aujourd'hui).

    Le code de la création des 2 tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CLIENT]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[CLIENT]
    GO
     
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[INTERVENTION]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[INTERVENTION]
    GO
     
    CREATE TABLE [dbo].[CLIENT] (
    	[NumClt] [numeric](6, 0) NOT NULL ,
    	[NomClt] [varchar] (50) COLLATE French_CI_AS NULL ,
    	[PrénomClt] [varchar] (50) COLLATE French_CI_AS NULL ,
    	[StatutClt] [varchar] (12) COLLATE French_CI_AS NULL ,
    	[Contact 1] [varchar] (50) COLLATE French_CI_AS NULL ,
    	[Contact 2] [varchar] (50) COLLATE French_CI_AS NULL ,
    	[NbrIntervention] [int] NULL 
    ) ON [PRIMARY]
    GO
     
    CREATE TABLE [dbo].[INTERVENTION] (
    	[NumIntervention] [char] (10) COLLATE French_CI_AS NOT NULL ,
    	[Commentaire] [char] (10) COLLATE French_CI_AS NULL ,
    	[Date] [datetime] NULL ,
    	[NomClt] [varchar] (50) COLLATE French_CI_AS NULL ,
    	[NomIntervenant] [varchar] (50) COLLATE French_CI_AS NULL ,
    	[Facturation] [bit] NULL ,
    	[NumClt] [numeric](6, 0) NULL 
    ) ON [PRIMARY]
    GO
    Donc je voudrais effectuer la mise à jour du champ CLIENT.NbrIntervention c'est à dire qu'il calcul le nombre d'intervention effectué pour chaque client.

    J'espère qu'avec cela tu pourras me donner un coup de main car j'ai vraiment besoin d'aide pour les triggers.

    Merci d'avance!

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Par défaut
    Y'aurait-il quelqu'un qui se débrouille parfaitement en trigger pour pouvoir m'aider ??

    Merci d'avance !!

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Par défaut
    Bon ben merci a tous ceux qui ont bien voulu m'aider.

    Je pense y arrivé soit en faisant un trigger ou alors je vais créer une vue juste pour "Client".

    Merci à tous.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/03/2013, 17h18
  2. Est-ce possible d'avoir un champ hypertexte en MySQL?
    Par JimmyB dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 13/07/2007, 14h09
  3. Réponses: 11
    Dernier message: 06/11/2006, 22h51
  4. [MySQL] Est-ce possible de creer des champs en temps réel lors d'une requête SQL ?
    Par kaptnkill dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/09/2006, 19h18
  5. Réponses: 7
    Dernier message: 08/03/2004, 15h30

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