Maison >base de données >tutoriel mysql >Comment agréger correctement les données de plusieurs tables dans SQL à l'aide de sous-requêtes ?
Requête SQL pour agréger les données de plusieurs tables
En SQL, l'agrégation des données de plusieurs tables peut être réalisée à l'aide de diverses techniques. Voici un scénario et une solution à une requête qui combine les données de deux tables :
Scénario :
Considérez deux tables, AP et INV, toutes deux contenant des colonnes [PROJET] et [Valeur]. L'objectif est de récupérer un résultat qui calcule la somme de [Valeur] pour chaque projet à partir des deux tables, ce qui donne le format suivant :
PROJECT | SUM_AP | SUM_INV ---------+--------+-------- XXXXX | 500 | 800
Requête incorrecte :
La requête suivante a été tentée mais a abouti à des sommes inexactes :
SELECT AP.[PROJECT], SUM(AP.Value) AS SUM_AP, SUM(INV.Value) AS SUM_INV FROM AP INNER JOIN INV ON (AP.[PROJECT] = INV.[PROJECT]) WHERE AP.[PROJECT] = 'XXXXX' GROUP BY AP.[PROJECT]
Raison de l'erreur Résultats :
La requête incorrecte regroupe les valeurs avant d'appliquer la somme, ce qui entraîne l'inclusion de valeurs de projet en double dans les sommes.
Solution correcte :
Pour résoudre ce problème, une requête impliquant des sous-sélections peut être utilisée :
SELECT AP1.[PROJECT], (SELECT SUM(AP2.Value) FROM AP AS AP2 WHERE AP2.PROJECT = AP1.PROJECT) AS SUM_AP, (SELECT SUM(INV2.Value) FROM INV AS INV2 WHERE INV2.PROJECT = AP1.PROJECT) AS SUM_INV FROM AP AS AP1 INNER JOIN INV AS INV1 ON (AP1.[PROJECT] = INV1.[PROJECT]) WHERE AP1.[PROJECT] = 'XXXXX' GROUP BY AP1.[PROJECT]
Cette requête utilise des sous-sélections pour calculer les sommes au sein de chaque projet séparément, éliminant le problème des valeurs en double et fournissant les résultats globaux corrects.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!