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 :

WHERE sur un ALIAS


Sujet :

Développement SQL Server

  1. #1
    Membre averti
    Avatar de Cyrilange
    Profil pro
    Inscrit en
    février 2004
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2004
    Messages : 268
    Points : 353
    Points
    353
    Par défaut WHERE sur un ALIAS
    J'aimerais ajouter une condition sur une nouvelle colonne mais il semble que cela ne fonctionne pas.
    Voici la requête qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT        CompagnieSet.nom, SUM(ContratSet.primeAnnuelle) AS totalPrime, PlafondSet.mini, PlafondSet.maxi, PlafondSet.tauxSurCom
    FROM            ContratSet INNER JOIN
                             CompagnieSet ON ContratSet.fkCompagnie = CompagnieSet.pkCompagnie INNER JOIN
                             PlafondSet ON CompagnieSet.pkCompagnie = PlafondSet.fkCompagnie
    WHERE        (ContratSet.resiliation = 0)
    GROUP BY CompagnieSet.nom, PlafondSet.mini, PlafondSet.maxi, PlafondSet.tauxSurCom
    J'obtient le résultat suivant :
    AxA | 1211,00 | 1000,00 | 50000,00 | 5,00
    AxA | 1211,00 | 50000,00 | 100000,00 | 8,00
    SWISS | 2070,00 | 1000,00 | 50000,00 | 5,00

    J'aimerais pouvoir faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT        CompagnieSet.nom, SUM(ContratSet.primeAnnuelle) AS totalPrime, PlafondSet.mini, PlafondSet.maxi, PlafondSet.tauxSurCom
    FROM            ContratSet INNER JOIN
                             CompagnieSet ON ContratSet.fkCompagnie = CompagnieSet.pkCompagnie INNER JOIN
                             PlafondSet ON CompagnieSet.pkCompagnie = PlafondSet.fkCompagnie
    WHERE        (ContratSet.resiliation = 0) AND totalPrime>PlafondSet.mini 
    GROUP BY CompagnieSet.nom, PlafondSet.mini, PlafondSet.maxi, PlafondSet.tauxSurCom
    Pour obtenir ça :
    AxA | 1211,00 | 1000,00 | 50000,00 | 5,00
    SWISS | 2070,00 | 1000,00 | 50000,00 | 5,00


    Merci de votre aide.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    janvier 2010
    Messages
    5 641
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : janvier 2010
    Messages : 5 641
    Points : 13 067
    Points
    13 067
    Par défaut
    bonsoir

    le filtre est évalué avant les colonnes spécifiées dans la clause SELECT...
    donc au moment ou le filtre est évalué, dans votre cas "totalPrime" n'existe pas...

    faites comme ca :

    Code sql : 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
    SELECT        
      CompagnieSet.nom
      , SUM(ContratSet.primeAnnuelle) AS totalPrime
      , PlafondSet.mini
      , PlafondSet.maxi 
      , PlafondSet.tauxSurCom
    FROM
      ContratSet 
      INNER JOIN CompagnieSet 
        ON ContratSet.fkCompagnie = CompagnieSet.pkCompagnie 
      INNER JOIN PlafondSet 
        ON CompagnieSet.pkCompagnie = PlafondSet.fkCompagnie
    WHERE
      (ContratSet.resiliation = 0) 
      AND SUM(ContratSet.primeAnnuelle)>PlafondSet.mini 
    GROUP BY 
      CompagnieSet.nom
      , PlafondSet.mini
      , PlafondSet.maxi
      , PlafondSet.tauxSurCom

  3. #3
    Modérateur

    Homme Profil pro
    Consultant Teradata
    Inscrit en
    septembre 2008
    Messages
    8 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Teradata

    Informations forums :
    Inscription : septembre 2008
    Messages : 8 150
    Points : 16 433
    Points
    16 433
    Par défaut
    Les opérations de filtrage sur les colonnes résultant d'un calcul d'agrégation se font dans le HAVING :
    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
      SELECT Cm.nom,
             SUM(Cn.primeAnnuelle) AS totalPrime,
             Pl.mini,
             Pl.maxi,
             Pl.tauxSurCom
        FROM ContratSet as Cn
             INNER JOIN CompagnieSet as Cm
               ON Cm.pkCompagnie = Cn.fkCompagnie
             INNER JOIN PlafondSet as Pl 
               ON Pl.fkCompagnie = Cm.pkCompagnie
       WHERE Cn.resiliation = 0
    GROUP BY Cm.nom,
             Pl.mini,
             Pl.maxi,
             Pl.tauxSurCom
      HAVING SUM(Cn.primeAnnuelle) > Pl.mini

  4. #4
    Membre averti
    Avatar de Cyrilange
    Profil pro
    Inscrit en
    février 2004
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2004
    Messages : 268
    Points : 353
    Points
    353
    Par défaut
    En effet, j'avais bien essayé l'exemple de aieeeuuuuu mais ça ne marchait pas non plus.

    Merci Waldar, c'est bien le HAVING qui me manquait et que je n'avais pas utilisé auparavant.

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    janvier 2010
    Messages
    5 641
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : janvier 2010
    Messages : 5 641
    Points : 13 067
    Points
    13 067
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Les opérations de filtrage sur les colonnes résultant d'un calcul d'agrégation se font dans le HAVING :
    ha oui, aussi

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

Discussions similaires

  1. Clause Where sur alias
    Par jeanmarc1234 dans le forum Développement
    Réponses: 2
    Dernier message: 09/12/2008, 17h35
  2. Clause Where sur une Date
    Par Zebulonn dans le forum Installation
    Réponses: 31
    Dernier message: 20/10/2005, 11h56
  3. Pb de mot de passe sur un alias interbase
    Par dolzy dans le forum Bases de données
    Réponses: 4
    Dernier message: 21/09/2005, 22h53
  4. operation sur des alias
    Par 74160 dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/11/2003, 18h19
  5. where sur la première colonne
    Par r-zo dans le forum Requêtes
    Réponses: 8
    Dernier message: 28/07/2003, 09h55

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