2012-12-01 3 views
6

Ho un problema con la query SQL.
Ho tableA:Somma di somme in diverse tabelle

productA priceA 
P1  18 
P2  35 
P1  22 
P2  19 

e anche tableB:

productB priceB 
P1  3 
P2  15 
P1  80 
P2  96 

voglio come risultato della somma dei due prodotti dai 2 tavoli.

product price 
P1  123 
P2  165 

Voglio sommare le somme dei due tavoli.
Sto provando questa domanda ma è sbagliato.

SELECT productA, 
    (SELECT SUM(priceA) FROM tableA GROUP BY productA), 
    (SELECT SUM(priceB) FROM tableB GROUP BY productB) 
FROM tableA, tableB 
WHERE productA = productB 
GROUP BY productA 

Per favore aiutatemi.

+0

Puoi spiegare cosa intendi con "è sbagliato" - cosa produce la query? I 2 sub-selects restituiscono i risultati corretti per ogni singolo prodotto? –

+0

qual è il tuo motore? – Sebas

risposta

3

È possibile utilizzare un union per unire le tabelle, e group by sul risultato:

select product 
,  sum(price) 
from (
     select productA as product 
     ,  priceA as price 
     from TableA 
     union all 
     select productB 
     ,  priceB 
     from TableB 
     ) as SubQueryAlias 
group by 
     product 
+0

Funziona! Grazie! :) – vaka

+0

Ti sto mandando in su perché hai l'unione tutti. –

1

Questa è letteralmente la somma delle somme:

select 
    product, 
    sum(price) 
from (
    select productA as product, sum(priceA) as price from tableA group by 1 
    union all 
    select productB, sum(priceB) from tableB group by 1 
) 
group by 1 
+1

Questa soluzione non è corretta perché 'union' rimuove i duplicati. Dovresti avere "unione tutti". –

+0

@GordonLinoff Accidenti, hai ragione! Di solito sono un nazista per "unione tutti". Grazie per averlo indicato. (Ho risolto la query) – Bohemian

0

Perché un join sembra come un naturale modo per affrontare questo problema, ecco una soluzione con join anziché union. Si aggrega i dati in sottoquery prima, poi si unisce i risultati insieme:

select coalesce(a.productA, b.productB) as product, 
     coalesce(a.PriceA, 0) + coalesce(b.PriceB, 0) as price 
from (select productA, sum(PriceA) as PriceA 
     from TableA 
     group by productA 
    ) a full outer join 
    (select productB, sum(PriceB) as PriceB 
     from TableB 
     group by productB 
    ) b 
    on a.productA = b.prodctB 

Io sto usando un full outer join nel caso in cui le tabelle sono diverse serie di prodotti. Di conseguenza, ho bisogno di avere il coalesce nell'istruzione select.