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 :

colonne calculer sur sql server


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 36
    Points
    36
    Par défaut colonne calculer sur sql server
    bonjour,
    je suis entrain de créer mes tables sur sql server 2005 , est ce que c'est possible d'avoir ds une table une colonne calculer a partire d'autre colonne de la même table ( + / * - )

    mecri

  2. #2
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Je ne sais pas si cela est possible ou non lors de la definition de la table.

    Par contre ca doit etre facilement faisable avec un update.

    Tu peux aussi penser à un trigger on insert, et update, qui te met ta colonne à jour pour en live.

    Cependant, je ne te conseillerai aucune de ces solutions car ca ne ferait qu'allourdir et ralentir ta db.
    Pourquoi ne pas calculer cette valeur au moment de ta requete ?

  3. #3
    Membre du Club Avatar de zakaroh
    Inscrit en
    Avril 2008
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 129
    Points : 48
    Points
    48
    Par défaut
    j ai le mm problemke toi pauvrmen " j aime bien ton pseudi"

    en fait ds plusieu ds une table je dois avoir la somme de deux colone de la même table,,, merci de me dire la solution car ca va me rendre dinge cette table..

    merci

  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 : 42
    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,

    Il serait fort aimable à certains d'écrire en français.

    Deux cas pour nos colonnes "calculées" :
    - La colonne "calculée" est dans une autre table que la table qui sert à calculer : dans ce cas, lors de la mise à jour de la table par la procédure stockée, il suffit de rajouter du code pour faire le calcul de la valeur et réaliser l'UPDATE dans la seconde table. Cela n'alourdit en aucun cas le traitement, il faut simplement écrire proprement sa requête de mise à jour et vérifier que les bons indexes sont présents.

    - La colonne vraiment calculée : c'est une colonne qui fait partie de la table et dont la valeur est calculée avec d'autres colonnes de la table. Dans ce cas, c'est lors de la creation de la table que l'on définit la formule de calcul :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE maTable
    (
    	MaColonneA INT NOT NULL,
    	MaColonneB INT NOT NULL,
    	MaColonneCalculee INT AS (MAColonneA + MaColonneB) PERSISTED
    );
    GO
    L'option PERSISTED permet de stocker physiquement les valeurs calculées dans la table et mettra à jour les valeurs lorsque n'importe quelle colonne dont dépend la colonne calculée est mise à jour.

    A+

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 36
    Points
    36
    Par défaut
    bonjour,
    merci pour vos reponses
    voila l ecris ce code

    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
    USE [sami]
    GO
    /****** Object:  Table [dbo].[Table_1]    Script Date: 05/02/2008 11:02:07 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Table_1](
    	[P1] [nchar](10) NOT NULL,
    	[A] [int] NULL,
    	[B] [int] NULL,
    	[C] [int] AS ([B]+[A]) PERSISTED,
     
    )
    GO
     
     
     CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED 
    (
    	[P1] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]&
    ) ON [PRIMARY]

    ou il ya l erreur merci

  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 810
    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 810
    Points : 52 863
    Points
    52 863
    Billets dans le blog
    5
    Par défaut
    Vous pouvez faire des colonnes calculées dans SQL Server 2005 :
    • à la volée
    • pertistante
    • indexées


    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE T 
    (COL1 INT,
     COL2 INT,
     COLCALC AS COL1 + COL2,
     COLCALC_PERSISTANTE AS COL1 - COL2 PERSISTED,
     COLCALC_PERSISTANTE_INDEXEE  AS COL1 * COL2);
    GO
     
    CREATE INDEX X ON T (COLCALC_PERSISTANTE_INDEXEE);
    GO
    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
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 36
    Points
    36
    Par défaut
    merci pour ta reponse
    voila j ai fai ce code

    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
    USE [fahmi]
    GO
    /****** Object:  Table [dbo].[Table_4]    Script Date: 05/02/2008 14:52:02 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Table_4]
    ([A] INT,
     [B] INT,
     [C] AS COL1 + COL2,
     
    GO
     
    CREATE INDEX X ON T ([C]_PERSISTANTE_INDEXEE);
    GO
     
    [lmlml] [nchar](10) NULL
    ) ON [PRIMARY]

    ensuite j ai eu ce message

    Msg 102, Level 15, State 1, Line 4
    Incorrect syntax near ','.
    Msg 102, Level 15, State 1, Line 2
    Incorrect syntax near '_PERSISTANTE_INDEXEE'.
    Msg 102, Level 15, State 1, Line 2
    Incorrect syntax near '10'.

    j 'avance vraiment pas merci pour votre aide

  8. #8
    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 : 42
    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,

    L'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [lmlml] [nchar](10) NULL
    ) ON [PRIMARY]
    est une erreur

    En revanche la table Table_4 et l'index X doivent exister

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 810
    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 810
    Points : 52 863
    Points
    52 863
    Billets dans le blog
    5
    Par défaut
    Excusez moi, mais commencez par apprendre le SQL, parce que là c'est assez navrant de devoir rectifier toutes vos erreurs.

    SQL est un langage de programmation normalisé utilisé dans 3 programmes informatiques sur 4 !

    Mon site web comme mes bouquins peuvent vous y aider.

    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/ * * * * *

  10. #10
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 761
    Points : 2 999
    Points
    2 999
    Par défaut
    Je me demande à quoi cela sert de stocker le résultat...

    Ne serait-ce pas plus opportun de créer une vue qui calculerait la colonne ?

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT PrixAchat, FraisDivers, (PrixAchat + FraisDivers) * TauxBenefSouhaite) As PrixVente FROM tbl_Articles
    Il me semble que si ta nouvelle colonne peut s'obtenir sur base des données provenant d'autres colonnes, il est inutile de stocker le résultat.

    Je ne suis pas expert mais je pense que cela n'aura pas d'impact sur l'optimisation : lire les données du disque ou calculer le résultat devrait avoir un impact identique.

    C'est juste un avis.
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 810
    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 810
    Points : 52 863
    Points
    52 863
    Billets dans le blog
    5
    Par défaut
    Si votre colonne calculée est persistante, cela stocke en permanence le calcul. Ceci améliore notablement les vitesse en lecture puisqu'il n'y a plus de calculs à faire ligne à ligne.
    Si de plus vous indexez cette colonnes, alors cela améliore en sus les recherches.
    Tout dépends le niveau d'optimisation que l'on souhaite.

    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/ * * * * *

  12. #12
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 36
    Points
    36
    Par défaut
    désolé je n arrive pas a calculé ma colonne , peut etre ke j ecris pas le code ds le bon endroi

    est ce que vous pouvez me guider pour y arriver

    ps : j travail avec sql server 2005

    merci

  13. #13
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 36
    Points
    36
    Par défaut
    voila j ecris ce code pour créer une table mais j'ai un message comme quoi il des erreurs,, j'ai cherché longtemsp mais j arrive pas a résoudre mon probleme..

    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
     
    REATE TABLE duration_estimate 
     
    (
     
        ID_project varchar NOT NULL,
    	duration estimate PH_0 int NULL,
    	duration estimate PH_1 int NULL,
    	duration estimate PH_2 int NULL,
    	duration estimate PH_3 int NULL,
    	duration Estimate at completion int NULL,
    	variance PH_0 AS ((( duration Estimate at completion / duration estimate PH_0) - 1) * 100) PERSISTED,
    	variance PH_1 AS ((( duration Estimate at completion / duration estimate PH_1) - 1) * 100) PERSISTED,
    	variance PH_2 AS ((( duration Estimate at completion / duration estimate PH_2) - 1) * 100) PERSISTED,
    	variance PH_3 AS ((( duration Estimate at completion / duration estimate PH_3) - 1) * 100) PERSISTED,
    );
     
    GO
    dans ma table j'ai 4 colonnes calculé

    merci de votre aide

  14. #14
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 810
    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 810
    Points : 52 863
    Points
    52 863
    Billets dans le blog
    5
    Par défaut
    les noms des objets d'une base répondent à la norme SQL :
    pas de blanc de caractères diacritique (accents, cédille...) par de signe de ponctuation !
    Bref des lettres, des chiffres et le blanc souligné !
    Lisez ceci : http://sqlpro.developpez.com/cours/s...age=partie1#L1
    Comment voulez vous qu'il comprenne ce que vous luis dite. Vous ne faites pas du SQL vous faites du Javaniais!!!

    donc, rectifions comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ID_project varchar(???) NOT NULL,
    	duration_estimate_PH_0 int NULL,
    	duration_estimate_PH_1 int NULL,
    	duration_estimate_PH_2 int NULL,
    	duration_estimate_PH_3 int NULL,
    	duration_estimate_at_completion int NULL,
    	variance_PH_0 AS ((( duration_Estimate_at_completion / duration_estimate_PH_0) - 1) * 100) PERSISTED,
    	variance_PH_1 AS ((( duration_Estimate_at_completion / duration_estimate_PH_1) - 1) * 100) PERSISTED,
    	variance_PH_2 AS ((( duration_Estimate_at_completion / duration_estimate_PH_2) - 1) * 100) PERSISTED,
    	variance_PH_3 AS ((( duration_Estimate_at_completion / duration_estimate_PH_3) - 1) * 100) PERSISTED,
    Notez qu'un VARCHAR se dimensionne : mettez ce que vous voulez, mais mettez quelque chose. Comme je suppose que c'est la clef il faut mettre le moins long possible...

    Le problème que vous allez maintenant avoir c'est que vos variances vont apparaître en nombres entiers... Si vous voulez des nombres à virgule, il faut "caster" toutes les colonnes de l'expression calculée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((( CAST(duration_Estimate_at_completion AS FLOAT) / CAST(duration_estimate_PH_3 AS FLOAT)) - 1.0 ) * 100.0)
    Enfin, votre table est ANORMALE, c'est à dire pas normalisé. Vous ne respectez pas la première forme normale. Vos requêtes SELECT seront difficile à écrire et vos performances en matière de requêtes vont être de plus en plus lamentable au fur et a mesure que vous allez avoir une montée en charge.

    Voici main,tenant la version normalisée de votre bousin :

    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
    CREATE TABLE dbo.T_duration_DUR
    (DUR_ID_project varchar(32) NOT NULL PRIMARY KEY,
     DUR_estimate_at_completion int NULL);
    GO
     
    CREATE TABLE dbo.T_duration_estimate_DES
    (DUR_ID_project varchar(32) NOT NULL 
        FOREIGN KEY REFERENCES T_duration_DUR (DUR_ID_project),
     DES_PH int NOT NULL
        CONSTRAINT PK_DES PRIMARY KEY (DUR_ID_project, DES_PH),
     DES_duration_estimate int NULL);
    GO
     
    CREATE VIEW dbo.V_duration_estimate_DES
    WITH SCHEMABINDING
    AS
    SELECT DUR.DUR_ID_project, DES_PH, 
           DUR_estimate_at_completion, 
           DES_duration_estimate,
           (CAST(DUR_estimate_at_completion AS DECIMAL(16,2)) 
            / CAST(DES_duration_estimate AS DECIMAL(16,2)) 
           - 1.0 ) * 100.0 AS DES_variance_PH
    FROM   dbo.T_duration_DUR AS DUR
           INNER JOIN dbo.T_duration_estimate_DES AS DES
                 ON DUR.DUR_ID_project = DES.DUR_ID_project
    GO
     
    CREATE UNIQUE CLUSTERED INDEX X_V_DES_PK ON dbo.V_duration_estimate_DES (DUR_ID_project, DES_PH)
    GO
    Maintenant faites ce que vous voulez... Plus vous ferez n'importe quoi, plus je gagnerais ma vie : je fais des audits de base de données dont les performances sont catastrophiques à 2000 € jour et cela me permet de vendre quelques dizaines de jours de prestation ensuite pour rectifier le tir !!!

    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/ * * * * *

Discussions similaires

  1. Somme de colonne comme sur Sql Server
    Par Soulama dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 16/06/2010, 13h51
  2. Réponses: 2
    Dernier message: 08/11/2007, 10h54
  3. Réponses: 2
    Dernier message: 08/11/2007, 10h54
  4. Réponses: 1
    Dernier message: 04/04/2007, 13h43
  5. problème de float sur SQL server 2000.
    Par fidji dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 24/07/2003, 14h15

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