2011-11-16 3 views
1

Je suis bloqué sur un problème SQL, je suis presque sûr que tout est facile mais je ne trouve pas de réponse correcte. Ci-dessous, voici l'exemple. Je veux combiner ces 2 requêtes:Combiner 2 requêtes SQL

SELECT 
    num_rata, SUM(val_imp*0.01) AS amount 
FROM table1 
WHERE 
    col1 <> 0 
    AND num_contract = 88 
GROUP BY num_rata 

qui retourne quelque chose comme:

1 215.00 
2 220.00 
3 210.00 
4 115.00 
5 315.00 

Et:

SELECT 
    num_rata, SUM(val_ban*0.01) AS amount 
FROM table2 
WHERE 
    num_contract = 2988 
GROUP BY num_rata; 

Exemple jeu de résultats:

1 15.00 
2 615.00 
3 275.00 
4 285.00 
5 285.00 
6 275.00 
7 260.00 
8 215.00 
9 215.00 

En finale résultat je voudrais quelque chose lik e this:

1 215.00 15.00 
2 220.00 615.00 
3 210.00 275.00 
4 115.00 285.00 
5 315.00 285.00 
6   275.00 
7   260.00 
8   215.00 
9   215.00 

Nous vous remercions de votre intérêt.

fabien.

Répondre

3

Vous pouvez utiliser soit une union ou une jointure externe - Je préférerais un syndicat, comme celui-ci:

SELECT num_rata, sum(val_imp)*0.01 imp_amount, sum(val_ban)*0.01 ban_amount 
from (SELECT num_rata, val_imp, 0 val_ban 
     FROM table1 
     WHERE col1 <> 0 AND num_contract = 88 
     UNION ALL 
     SELECT num_rata, 0 val_imp, val_ban 
     FROM table2 
     WHERE num_contract = 2988) v 
GROUP BY num_rata; 
+0

Merci Mark, mais désolé je ne comprends pas .... – feub

+0

@feub, Quel peu ne vous obtenez? Aussi, avez-vous essayé de l'exécuter (ou la situation réelle est-elle plus compliquée)? –

+0

Par exemple, dans 'SELECT num_rata, val_imp, 0 val_ban', je n'ai pas la syntaxe' 0 val_ban'. Et le 'v' est une faute de frappe? Je vous remercie. – feub

0

Pouvez-vous essayer ce faites cela:

SELECT num_rata, (
    coalesce(
     (SELECT SUM(val_imp*0.01) FROM table1 t1 WHERE t1.num_rata = foo.num_rata) 
    ,0) 
) as col1, (
    coalesce(
     (SELECT SUM(val_ban*0.01) FROM table2 t2 WHERE t2.num_rata = foo.num_rata) 
    ,0) 
) as col2 FROM 
(
    (SELECT num_rata FROM table1 WHERE col1 <> 0 AND num_contract = 88) 
    UNION ALL 
    (SELECT num_rata FROM table2 WHERE num_contract = 2988) 
) as foo; 

je pourrais avoir erreur de syntaxe (je vous écris ceci d'une conférence universitaire), mais (ou similaire) devrait faire l'affaire.

1

Je pense que c'est ce que vous voulez:

select 
    t1.num_rata, 
    SUM(t1.val_imp*0.01) AS amount1, 
    SUM(t2.val_ban*0.01) AS amount2 
from 
    table1 t1 right outer join table2 t2 on t1.num_rata=t2.num_rata 
where 
    t1.col1<>0 and 
    t1.num_contract = 88 and 
    t2.num_contract = 2988 
GROUP BY t1.num_rata 
+1

Je suis d'accord avec elle être un problème de jointure externe, mais je pense que cela devrait être une jointure externe droite, car elle a besoin de tous les enregistrements de la deuxième table. Voir ici quelques exemples avec des jointures externes gauche et droite: http://en.wikipedia.org/wiki/Join_%28SQL%29 – user998692

+0

Je suis d'accord, merci ... trop tôt le matin - besoin de plus de caféeeee ....: -) (corrigé ma réponse ci-dessus) –

+0

Potentiellement, une jointure externe complète. En outre, vous semblez supposer que s'il y a plusieurs enregistrements pour un num_rata donné sur une table, il n'y aura jamais plus d'un enregistrement pour le même num_rata sur l'autre table - sinon, les SUMs seront gonflées. En supposant que les tables ont chacune leur propre champ ID, vous pouvez le réparer en changeant SUM (t1.val_imp * 0.01) 'SUM (t1.val_imp * 0.01)/COUNT (DISTINCT COALESCE (t2.id, 1)) ', et vice versa pour val_ban. –