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;
tout regroupé par la valeur de Notez qu'un enregistrement pour un 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> mois_ref code>. p>
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>
5 Réponses :
Avez-vous essayé d'utiliser un syndicat?
@ROMOUTEZ: Pas de problème. Une question, avez-vous profilé les différentes solutions? Je suppose que regrouper par - union - regrouper par i> sera plus rapide sur de grands ensembles de données que juste Union - regroupement par i> solution.
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
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 ...
Je finis enfin que cela fonctionne en utilisant le réponse Lieven .
Voici le code correct ( montant1 = ... code> ne fonctionne pas sur mon environnement et il y a trop de
; code> dans la requête): p>
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
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 où code> clause en dehors du sous
Sélectionnez CODE>.
Merci j'y ai utilisé deuxième.
SELECT (SELECT SUM(amount) from debit) as debitamounts, (SELECT SUM(amount) from credit) as creditamounts
Veuillez ajouter quelques commentaires sur votre solution sur les raisons pour lesquelles et comment cela résout le problème