Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/01/2011, 17h41   #1
Membre habitué
 
Avatar de Cyrilange
 
Inscription : février 2004
Messages : 179
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 179
Points : 138
Points : 138
Envoyer un message via MSN à Cyrilange
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 :
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 :
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.
__________________
cyrilhome.over-blog.net
Cyrilange est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 23h16   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 :
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
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 00h40   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Les opérations de filtrage sur les colonnes résultant d'un calcul d'agrégation se font dans le HAVING :
Code :
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
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 06h36   #4
Membre habitué
 
Avatar de Cyrilange
 
Inscription : février 2004
Messages : 179
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 179
Points : 138
Points : 138
Envoyer un message via MSN à Cyrilange
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.
__________________
cyrilhome.over-blog.net
Cyrilange est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 10h10   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h50.


 
 
 
 
Partenaires

Hébergement Web