2009-09-07 18 views
11

voglio ottenere la somma di diverse colonne da 2 tabelle differenti (queste tabelle condividono la stessa struttura).Ottenere la somma di diverse colonne di due tabelle

Se considero solo una tabella, vorrei scrivere questo tipo di query:

SELECT MONTH_REF, SUM(amount1), SUM(amount2) 
    FROM T_FOO 
    WHERE seller = XXX 
    GROUP BY MONTH_REF; 

Tuttavia, mi piacerebbe lavorare anche con i dati dalla T_BAR tavolo, e poi avere una query select che restituiscono le colonne seguenti:

  • MONTH_REF
  • SUM (T_FOO.amount1) + SUM (T_BAR.amount1)
  • SUM (T_FOO.amount2) + SUM (T_BAR.amount2)

tutto raggruppato per il valore di MONTH_REF.

Si noti che un record per un dato MONTH_REF può essere trovato in una tabella, ma non nell'altra tabella. In questo caso, vorrei ottenere la somma di T_FOO.amount1 + 0 (o 0 + T_BAR.amount1).

Come posso scrivere la mia query SQL per ottenere queste informazioni?

Per informazioni, il mio database è Oracle 10g.

risposta

12

È possibile unione le tabelle prima che il gruppo di (questo è su Oracle , tra l'altro):

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

è inoltre possibile unione le tabelle con il campo venditore e del filtro in un secondo momento (in caso di necessità logica più avanzata):

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 
+0

Infine preferisco la tua soluzione (la prima) in quanto è più chiara della soluzione Lieven ... – romaintaz

+0

La prima è più efficiente perché stai riducendo il numero di righe prima di quando sposti la clausola 'WHERE' al di fuori del sottotitolo' SELECT'. – JohnB

+0

Grazie ho usato il secondo. –

2

Hai provato a utilizzare un sindacato?

SELECT MONTH_REF, SUM(amount1), SUM(amount2) 
FROM (
    SELECT MONTH_REF, SUM(amount1) AS amount1, SUM(amount2) as amount2 
     FROM T_FOO 
     WHERE seller = XXX 
     GROUP BY MONTH_REF 
    UNION ALL SELECT MONTH_REF, SUM(amount1), SUM(amount2) 
     FROM T_BAR 
     WHERE seller = XXX 
     GROUP BY MONTH_REF 
) tmp 
GROUP BY MONTH_REF 
+0

@romaintaz: nessun problema. Una domanda, hai profilato le diverse soluzioni? Suppongo che * il raggruppamento per unione - il raggruppamento per * sarà più veloce su dataset di grandi dimensioni rispetto al solo * unione - raggruppamento per * soluzione. –

1

In alternativa, un outer join dovrebbe funzionare anche:

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 
+0

Questa query richiede troppo tempo (soprattutto rispetto alla risposta di Lieven) e inoltre restituisce risultati errati. Ha anche bisogno di NVL (SUM (...), 0) altrimenti otterrò valori nulli ... – romaintaz

1

ho finalmente ottenere questo lavoro con la risposta 's il Lieven.

Ecco il codice corretto (amount1 = ... non funziona sul mio ambiente, e ci sono troppi ; nell'interrogazione):

SELECT MONTH_REF, SUM(sumAmount1), SUM(sumAmount2) 
FROM (
    SELECT MONTH_REF, SUM(amount1) as sumAmount1, SUM(amount2) as sumAmount1 
     FROM T_FOO 
     WHERE seller = XXX 
     GROUP BY MONTH_REF 
    UNION ALL SELECT MONTH_REF, SUM(amount1), SUM(amount2) 
     FROM T_BAR 
     WHERE seller = XXX 
     GROUP BY MONTH_REF 
) tmp 
GROUP BY MONTH_REF 
-1
SELECT (SELECT SUM(amount) from debit) as debitamounts, (SELECT SUM(amount) from credit) as creditamounts 
+0

Aggiungi alcuni commenti sulla tua soluzione sul perché e come risolve il problema –

+0

Questo comando non è completo .... – taboubim

Problemi correlati