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 :

Ajout de colonnes sous SQL SERVER 2014


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 7
    Par défaut Ajout de colonnes sous SQL SERVER 2014
    Bonjour!

    Je cherche à faire un traitement de ma base sous SQL Server.

    Je fais plein de calculs. Je pourrais faire des SELECT * FROM ( SELECT * FROM ( SELECT * FROM ( .... )))) ou une suite d'ALTER TABLE pour mes calculs imbriqués.

    1/ En général quelle type de méthode est la plus coûteuse en terme de temps d'éxecution? (je suis sur mon petit PC à mwa avec des millions de ligne )

    2/ Je n'arrive pas à faire un calcul à partir d'une colonne calculée :

    je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE Table ADD Col5 as (case when Col1 > 50 then 1 else 0 ) PERSISTED; 
             ALTER TABLE Table ADD Col6 as Col5*COL4;
    ça ne marche pas... (dans l'exemple je sais que je n'ai pas besoin de Col5 mais j'ai beaucoup plus de calculs imbriqués que cela)
    Que faire? Merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Vous confondez SGBD relationnel et tableur !
    Dans un SGBDR les calculs sont ensembliste et quelque soit la complexité on ne fait qu'une seule requête avec l'intégralité de la formule de calcul. C'est pourquoi des colonnes calculées de colonnes calculées, cela n'est pas possible.

    Exprimez plus votre besoin de calcul avec un exemple concret, parce que c'est pas clair.

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

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 7
    Par défaut
    Bonjour,

    Je n'ai pas vraiment compris votre message, ni en quoi le fait que les calculs soient ensemblistes empêche de faire des colonnes calculées de colonnes calculées....

    Pour donner un exemple précis.
    J'ai une table avec 3 colonnes, A, B, et C.
    Je veux rajouter D = (si A > 50; 0, sinon 1)
    et E = ( D*C)

    J'ai en gros 3 possibilités:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1/   ALTER TABLE Table ADD D as (case when A > 50 then 1 else 0 ) PERSISTED; 
             ALTER TABLE Table ADD E as (case when A > 50 then 1 else 0 )*C;
    SELECT * FROM TABLE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    2/   SELECT *, E AS D*C FROM ( SELECT *, (case when A > 50 then 1 else 0 ) as D);
    ou


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3/    ALTER TABLE Table ADD D as (case when A > 50 then 1 else 0 ) PERSISTED; 
    SELECT *, E AS D*C FROM Table.
    Je veux savoir quelle est la meilleure façon de faire sachant que ce n'est pas 2 colonnes que je compte calculer, mais des 10 aines, chacune dépendant du résultat de la précédente... La méthode 2/ me semble clairement sous optimisée car on fait 2 fois le calcul....

    Et s'il y a une autre façon de faire
    moi, j'espérais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE Table ADD D as (case when A > 50 then 1 else 0 ) PERSISTED; 
    ALTER TABLE Table ADD E as (D*C ) PERSISTED; 
    SELECT * FROM TABLE

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Sans explications fonctionnelle (à quoi va servir ce que vous voulez faire...) il nous est difficile de vous orienter vers la meilleure solution.

    En principe les applications ne devrait JAMAIS utiliser directement les tables, mais passer par des vues.

    En l'occurrence, vous pourriez faire la vue suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE VIEW V_TABLE
    AS
    SELECT *, 
           CASE WHEN A > 50 THEN 1 ESLE 0 END AS D,
            CASE WHEN A > 50 THEN 1 ESLE 0 END * C AS E
    FROM   table;
    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/ * * * * *

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    Bonjour Kamel21,

    Ce que voulait dire SQLPro, C'est qu'il ne faut pas confondre un SGBD en l'occurrence SQL Server est un tableur ou gestionnaire de feuille de calcul comme Microsoft Excel
    et que, ce serait bien si vous pouvez exprimer concrètement vos besoins en terme fonctionnel. En effet, en fonction des vos besoins, peut être que d'autres approches et d'autres solutions seront plus appropriées.

    Comme l'a déjà rappelé SQLPro, vous ne pouvez pas, dans l'expression d'une colonne calculée (Exemple colonne E où E = D*C ), référencer une autre colonne elle-même calculée (Exemple colonne D, où D = (case when A > 50 then 1 else 0 end)), et ce, que les colonnes E et/ou D soient persistantes ou non. Vous aurez systématiquement le message d'erreur suivant:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg 1759, Level 16, State 0, Line nn
    Computed column 'D' in table 'MaTable' is not allowed to be used in another computed-column definition.

    Sinon la solution proposée par SQLPro d'utiliser une vue (VIEW) est une bonne approche.

    A+

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    Bonjour SQLPro,

    Je crois, et sauf erreur de ma part, que pour la colonne calculée E, il faut un CROSS APPLI, sinon on obtient l'erreur suivante :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg 207, Level 16, State 1, Procedure V_TABLE, Line 108
    Invalid column name 'D'.
    Je proposerais quelques chose comme ceci :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE VIEW V_TABLE
    AS
    SELECT T.*,  T_D.D, T_E.E 
    FROM MaTable  T 
    CROSS APPLY (SELECT (CASE WHEN T.A > 50 THEN 1 ELSE 0 END) AS D /*FROM DUAL*/) T_D 
    CROSS APPLY (SELECT (T_D.D * T.C ) AS E /*FROM DUAL*/) T_E
    Exemple :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM  V_TABLE
    Résultat :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Id	A	B	C	D	E
    1	25	4	3	0	0
    2	55	5	2	1	2
    3	84	3	4	1	4
    A+

Discussions similaires

  1. Décrypter les colonnes d'une table sous SQL-Server
    Par kariel dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 17/12/2014, 15h56
  2. Equivalent de rownum sous SQL server
    Par Isildur dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 27/07/2009, 15h48
  3. comment ajouté la langue arabe sous sql server 2000
    Par 21247692 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/10/2008, 16h31
  4. Supprimer une colonne sous SQL Serveur 2000
    Par WOLO Laurent dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 14/07/2003, 12h24
  5. MAJ d'une table sous SQL Server par insertion
    Par keish dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/06/2003, 16h23

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