Maison > base de données > tutoriel mysql > Comment puis-je calculer avec précision les sommes de plusieurs tables en SQL ?

Comment puis-je calculer avec précision les sommes de plusieurs tables en SQL ?

DDD
Libérer: 2024-12-30 11:43:15
original
883 Les gens l'ont consulté

How Can I Accurately Calculate SUMs from Multiple Tables in SQL?

Interrogation de plusieurs tables pour les calculs SUM

Dans le contexte des bases de données relationnelles, il est courant d'exiger l'agrégation des données sur plusieurs tables. Ceci est particulièrement utile pour résumer des valeurs ou calculer des totaux généraux. Cependant, il est important de comprendre les principes de synthèse des données pour garantir des résultats précis.

Un de ces scénarios se produit lors de l'interrogation de deux tables, AP et INV, qui partagent une colonne commune nommée [PROJECT]. L'objectif est de renvoyer un ensemble de résultats contenant PROJET comme clé primaire et deux colonnes récapitulatives : SUM_AP et SUM_INV, qui représentent respectivement la somme de la colonne Valeur de chaque projet dans les tables AP et INV.

Une approche courante pour résoudre ce problème, il faut utiliser une opération INNER JOIN, comme le montre le code suivant :

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]
Copier après la connexion

Cependant, cette requête renvoie des résultats incorrects car le regroupement L'opération (GROUP BY) est appliquée avant la sommation (SUM). Cela entraîne l'inclusion de valeurs en double dans la somme, ce qui conduit à des totaux gonflés.

Pour résoudre ce problème, une approche plus précise consiste à utiliser des sous-sélections pour effectuer l'agrégation séparément pour chaque table :

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]
Copier après la connexion

Cette requête révisée utilise des sous-sélections dans les fonctions SUM pour calculer les valeurs de SUM_AP et SUM_INV pour chaque projet. Les sous-sélections agrègent indépendamment la colonne Valeur de chaque table en fonction de la valeur PROJET correspondante, éliminant ainsi le problème des valeurs en double.

En utilisant cette approche, vous pouvez interroger efficacement plusieurs tables et effectuer des opérations d'agrégation précises pour obtenir les résultats récapitulatifs souhaités sans aucun calcul incorrect.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal