11
votes

Obtenir la somme de plusieurs colonnes de deux tables

Je veux obtenir la somme de plusieurs colonnes à partir de 2 tables différentes (ces tables partagent la même structure).

Si je considère seulement une table, j'écrirais ce type de requête: P>

SELECT MONTH_REF, SUM(amount1), SUM(amount2)
    FROM T_FOO
    WHERE seller = XXX
    GROUP BY MONTH_REF;
  • mois_ref li>
  • somme (t_foo.amount1) + somme (t_bar.amount1) li>
  • somme (t_foo.mount2) + somme (t_bar.amount2) li> ul>

    tout regroupé par la valeur de mois_ref code>. p>

    Notez qu'un enregistrement pour un mois_ref code> peut être trouvé dans une table mais pas dans l'autre table. Dans ce cas, je voudrais obtenir la somme de t_foo.amount1 + 0 code> (ou 0 + t_bar.amount1 code>). P>

    Comment puis-je Ecrivez ma requête SQL pour obtenir cette information? p>

    Pour plus d'informations, ma base de données est Oracle 10G. P> P>


0 commentaires

5 Réponses :


2
votes

Avez-vous essayé d'utiliser un syndicat? XXX


1 commentaires

@ROMOUTEZ: Pas de problème. Une question, avez-vous profilé les différentes solutions? Je suppose que regrouper par - union - regrouper par sera plus rapide sur de grands ensembles de données que juste Union - regroupement par solution.



1
votes

Alternativement, une jointure extérieure doit également fonctionner:

SELECT month_ref, 
       SUM(t_foo.amount1) + SUM(t_bar.amount1), 
       SUM(t_foo.amount2)+SUM(t_bar.amount2)
FROM   t_foo FULL OUTER JOIN t_bar
       ON t_foo.month_ref = t_bar.month_ref
GROUP BY month_ref


1 commentaires

Cette requête prend trop de temps (notamment par rapport à la réponse de Lieven) et, en outre, il renvoie de faux résultats. Il a également besoin de NVL (somme (...), 0) sinon je vais obtenir des valeurs nulles ...



1
votes

Je finis enfin que cela fonctionne en utilisant le réponse Lieven .

Voici le code correct ( montant1 = ... ne fonctionne pas sur mon environnement et il y a trop de ; dans la requête): xxx


0 commentaires

12
votes

Vous pouvez syndicaliser vos tables avant le groupe (ceci est sur Oracle, à la manière suivante):

 SELECT t.month_ref, SUM(t.amount1), SUM(t.amount2)
   FROM (SELECT month_ref, amount1, amount2, seller
           FROM T_FOO
          UNION ALL
         SELECT month_ref, amount1, amount2, seller
           FROM T_BAR) t
  where t.seller = XXX
  GROUP BY t.month_ref


3 commentaires

Enfin, je préfère votre solution (le premier) car il est plus clair que la solution de Lieven ...


La première est plus efficace car vous réduisez le nombre de lignes plus tôt que lorsque vous déplacez le clause en dehors du sous Sélectionnez .


Merci j'y ai utilisé deuxième.



-1
votes
SELECT (SELECT SUM(amount) from debit) as debitamounts, (SELECT SUM(amount) from credit) as creditamounts

1 commentaires

Veuillez ajouter quelques commentaires sur votre solution sur les raisons pour lesquelles et comment cela résout le problème