Salut,
Je pense que ma question doit être triviale et qu'il existe une façon élégante de la résoudre en une seule requête mais mes recherches perso + celles sur la doc, les FAQ et le forum ne m'ont pour l'instant pas permis d'y arriver.
Je présente le problème : soit 2 tables T1 et T2
Table T1 :
Champ1 (a1)......./........ Champ2 (a2)
A ......./........ 1
A ......./........ 2
B ......./........ 3
B ......./........ 4
Table T2 :
Champ1 (b1) ......./........ Champ2 (b2)
A ......./........ 10
A ......./........ 20
A ......./........ 30
B ......./........ 40
B ......./........ 50
B ......./........ 60
Les tables T1 et T2 sont liées par leur 1er champ (a1 = b1)
si l'on fait l'agrégation séparée de ces 2 tables; cela donne :
Résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT a1, sum(a2) as résultat1 FROM T1 GROUP BY a1
a1 ......./........ résultat1
A ........../........ 2
B ........../........ 7
Résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT b1, sum(b2) as résultat2 FROM T2 GROUP BY b1
b1 ........../........ résultat2
A ........../........ 60
B ........../........ 150
Je cherche simplement à combiner ces deux résultats en une seule requête afin d'obtenir :
Résultat :
a1 ........../........ résultat1 ........../........ résultat2
A ........../..................3 ................/........ 60
B ........../..................7 ................/........ 150
J'ai commencé par une simple jointure du type
qui donne pour résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT a1, sum(a2) as résultat1, sum(b2) as résultat2 FROM T1 LEFT JOIN T2 ON a1=b1 GROUP BY a1
a1 ........../........ résultat1 ........../........ résultat2
A ........../.............. 3 ........../.............. 120
B ........../.............. 7 ........../.............. 300
On voit bien que l'une des agrégations est multipliée par le nombre d'occurrence de chaque enregistrement avant l'autre agrégation.
J'ai donc ensuite essayé de passer par des sous-requêtes mais je bute
> soit sur le non support des fonctions d'agrégation au niveau de la clause "ORDER BY" (MSG144: "Impossible de faire appel à un agrégat ou à une sous-requête dans une expression utilisée dans la liste GROUP BY d'une clause GROUP BY")
> soit sur un problème de non support d'une agrégation sur une sous-requête
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT a1, sum(a2) as résultat1, (SELECT sum(b2) as résultat2 FROM T2 WHERE b1=a1) FROM T1 GROUP BY a1, (SELECT sum(b2) as résultat2 FROM T2 WHERE b1=a1)
MSg130 : "Impossible d'exécuter une fonction d'agrégation sur une expression comportant un agrégat ou une sous-requête."
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT a1, sum(a2) as résultat1, MAX(SELECT sum(b2) as résultat2 FROM T2 WHERE b1=a1) FROM T1 GROUP BY a1
J'ai ensuite une l'idée saugrenue de passer par la clause FROM et par une jointure, là aussi avec une erreur (MSG156 : "Syntaxe incorrecte vers le mot clé 'left'") :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT a1, SUM(a2) as résultat1, MAX(temp2) as résultat2 FROM (SELECT b1 as temp1, SUM(b2) as temp2 FROM T2) LEFT JOIN T1 ON temp1=a1 GROUP BY a1
Alors bien sûr, ce résultat s'obtient très facilement en faisant une requête de requête mais j'aurais bien aimé savoir le faire en une seule requête.
Merci d'avance de votre aide.
Partager