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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
SELECT a1, sum(a2) as résultat1 FROM T1 GROUP BY a1
Résultat :
a1 ......./........ résultat1
A ........../........ 2
B ........../........ 7

Code : Sélectionner tout - Visualiser dans une fenêtre à part
SELECT b1, sum(b2) as résultat2 FROM T2 GROUP BY b1
Résultat :
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

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
qui donne pour résultat :
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")
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)
> soit sur un problème de non support d'une agrégation sur une sous-requête
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.