2017-09-22 2 views
1

Je rencontre un problème impliquant plusieurs SUM() fonctions dans une instruction SQL SELECT en utilisant JOIN s.SQL SELECT plusieurs SUM() erreur

Chaque fois que je somme deux valeurs, la valeur de l'autre somme est doublée. Comment puis-je empêcher cela?

Exemple: SQL Fiddle - toutes les valeurs X et Y doivent être 2.

J'utilise SQLite.

Répondre

4

Vous pouvez utiliser UNION pour cela:

SELECT id, SUM(bamount) AS BAmount, SUM(camount) AS CAmount 
FROM 
(
    SELECT a.id, SUM(b.amount) AS bamount, 0 AS camount 
    FROM a 
    LEFT JOIN b ON a.id = b.a_id 
    GROUP BY a.id 
    UNION ALL 
    SELECT a.id, 0, SUM(c.amount) AS camount 
    FROM a 
    LEFT JOIN c ON a.id = c.a_id 
    GROUP BY a.id 
) AS t 
GROUP BY id; 

updated demo

Cela vous donnera:

| id | BAmount | CAmount | 
|----|---------|---------| 
| 1 |  2 |  2 | 
| 2 |  2 |  2 | 
| 3 |  2 |  2 | 
+0

Peut-être que je me trompe, mais cette version semble être plus efficace. – meeeee

4

Vous pouvez essayer d'effectuer les agrégations dans des sous-requêtes séparées. C'est une façon de contourner le problème des lignes de comptage doubles (ou triples, etc.) résultant d'une jointure.

SELECT 
    a.id, 
    t1.b_sum AS x, 
    t2.c_sum AS y 
FROM a 
LEFT JOIN 
(
    SELECT a_id, SUM(amount) AS b_sum 
    FROM b 
    GROUP BY a_id 
) t1 
    ON a.id = t1.a_id 
LEFT JOIN 
(
    SELECT a_id, SUM(amount) AS c_sum 
    FROM c 
    GROUP BY a_id 
) t2 
    ON a.id = t2.a_id;