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

Langage SQL Discussion :

Utilisation de champs calculés dans un select


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 138
    Points : 172
    Points
    172
    Par défaut Utilisation de champs calculés dans un select
    Bonjour.

    Avec sqlite, j'ai une table "operations" dans laquelle il y a pour des projets des investissements et des remboursements.

    La requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sqlite> select id_projet, sum(case when type="Invt" then montant  end) as invest, sum(case when type="Remb" then montant  end) as rembt from operations group by id_projet;
    me renvoie bien ce à quoi je m'attends.

    Si j'essaie d'utiliser "invest" ou "rembt" dans la même requête, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sqlite> select id_projet, sum(case when type="Invt" then montant  end) as invest, sum(case when type="Remb" then montant  end) as rembt, (invest-rembt) as encours from operations group by id_projet;
    j'ai l'erreur :
    Parse error: no such column: invest
    Comment faire ?

  2. #2
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 429
    Points : 1 124
    Points
    1 124
    Par défaut
    Bonjour,
    Citation Envoyé par thewolf Voir le message
    Si j'essaie d'utiliser "invest" ou "rembt" dans la même requête, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sqlite> select id_projet, sum(case when type="Invt" then montant  end) as invest, sum(case when type="Remb" then montant  end) as rembt, (invest-rembt) as encours from operations group by id_projet;
    j'ai l'erreur :

    Comment faire ?
    Comme les colonnes ne sont pas connues il te faut en répéter la définition (comme ceci)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select id_projet,
           sum(case when type="Invt" then montant  end) as invest,
           sum(case when type="Remb" then montant  end) as rembt,
           (sum(case when type="Invt" then montant  end) - sum(case when type="Remb" then montant  end)) as encours
      from operations 
      group by id_projet;
    Cordialement

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 138
    Points : 172
    Points
    172
    Par défaut
    Bonjour.

    Merci pour la réponse, je n'avais pas de problème pour obtenir ce que je souhaite avec cette méthode ou avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sum(case when O.type= "Remb" then -montant when O.type = "Invt" then montant end) as Encours
    Mais je trouvais un peu "idiot" de tout recalculer. Comme j'essaie de m'améliorer en SQL, j'espérais trouver une méthode plus sophistiquée ! Il me semble dommage voire surprenant de ne pas pouvoir réutiliser le calcul effectué.

    (d'ailleurs, quand on "répète la définition" à l'identique, est-ce que cela évite de refaire les calculs)

    Cordialement.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 429
    Points : 1 124
    Points
    1 124
    Par défaut
    Citation Envoyé par thewolf Voir le message
    (d'ailleurs, quand on "répète la définition" à l'identique, est-ce que cela évite de refaire les calculs)
    Je n'en sais rien je laisse la réponse à des gens plus doués que moi en SQL...

    Par ailleurs on peut aussi faire ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select id_projet,
           sum(case when type="Invt" then montant  end) as invest,
           sum(case when type="Remb" then montant  end) as rembt,
           sum(case when type="Invt" then montant
                    when type="Remb" then - montant end) as encours
      from operations
      group by id_projet;
    Ce qui évite de répéter deux fois la même choes (mais presque)

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 138
    Points : 172
    Points
    172
    Par défaut
    oui, la variante avec 2 comparaisons dans le case, c'est ce que j'ai écrit dans mon message précédent (sans reprendre toute la requête !) et c'est dans ce cadre que je demandais si c'était plus consommateur de ressources plutôt que la répétition à l'identique ...

  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 849
    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 849
    Points : 52 972
    Points
    52 972
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par thewolf Voir le message
    ... je trouvais un peu "idiot" de tout recalculer. Comme j'essaie de m'améliorer en SQL, j'espérais trouver une méthode plus sophistiquée ! Il me semble dommage voire surprenant de ne pas pouvoir réutiliser le calcul effectué...
    SQL n'est pas un langage procédural, mais un langage de requête. Ce que vous avez écrit n'est pas du tout ce qui sera exécuté. En effet l'optimiseur factorisera ce calcul au moment de l'exécution... Il n'y aura donc pas de recalcul au final...

    Si vous voulez minimiser votre écriture vous pouvez recourir aux sous requêtes et notamment aux CTE :

    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
    WITH 
    T AS
    (
    SELECT id_projet, 
           SUM(CASE
                   WHEN type = "Invt"
                   THEN montant
               END) AS invest, 
           SUM(CASE
                   WHEN type = "Remb"
                   THEN montant
               END) AS rembt
    FROM operations
    GROUP BY id_projet)
    SELECT *, (invest - rembt) AS encours
    FROM   T;
    A +

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 138
    Points : 172
    Points
    172
    Par défaut
    Merci beaucoup pour ces explications très claires.
    Cordialement.
    Christian

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

Discussions similaires

  1. Utiliser des champs calculé dans un criteria Hibernate
    Par bernidupont dans le forum Hibernate
    Réponses: 4
    Dernier message: 11/11/2017, 21h32
  2. [AC-2010] Utiliser un champ calculé dans une table comme clé primaire
    Par jawed dans le forum Access
    Réponses: 4
    Dernier message: 21/10/2016, 09h49
  3. Ré utiliser des champs calculés dans une requête
    Par boby62423 dans le forum Développement
    Réponses: 6
    Dernier message: 11/03/2011, 16h43
  4. Ajout d'un champs calculé dans un "select new" de linq Data
    Par Tardiff Jean-François dans le forum Linq
    Réponses: 1
    Dernier message: 18/04/2008, 11h47
  5. [CR 2008] utilisation de champ memo dans expert selection
    Par kikidrome dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 08/01/2008, 14h07

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