1 - Il est inutile de préciser le nom du schéma, en l'occurrence dbo, dans les clause SELECT, WHERE et GROUP BY. Cela alourdi le texte de la requête et nuit à la lisibilité du code SQL. Le nom du schéma (exemple dbo et cela peut être autre chose) est cependant requis dans les clauses FROM, JOIN (INNER JOIN, LEFT OUTER JOIN, CROSS JOIN etc.).
2 -
Dans votre 2ème requête, la sous-requête telle qu'elle est formulée, est complètement dé-corrélée du reste ! Et donc, c'est tout à fait normal que celle-ci retourne les mêmes résultats c.à.d les 4 enregistrements. L'ajout top 1, permet de corriger l'erreur syntaxique, en effet le résultat de la sous requête doit être atomique. Le top 1 retourne, la première ligne à savoir 23459.65, mais la sous-requête ne reste pas moins dé-corrélée du reste ! ce qui explique pourquoi vous vous retrouver avec la seule et même valeur
23459.65.
Par ailleurs, sachez que le SELECT TOP(1), sans préciser au préalable un ORDER BY, est complètement dépourvu de sens ! En effet, il n'y a aucun ordre naturel des lignes. et selon le plan d'exécution choisi par l'optimiseur vous auriez pu obtenir une autre valeur (autre que 23459.65) ! celle-ci sera aussi dupliquée pour toutes les lignes.
3 - Pour obtenir le résultat escompté, vous devez formuler votre requête comme ceci :
1 2 3 4 5 6
| SELECT c.Id_client, c.Nom_client, pac.Mois, pac.Année, SUM(pac.Montant) AS Expr1
FROM dbo.Client c
INNER JOIN dbo.Produit_achetes_client pac
ON c.Id_client = pac.Id_Client
WHERE c.Id_client = 14
GROUP BY c.Id_client, c.Nom_client, pac.Mois, pac.Année |
A+
Partager