2012-12-01 20 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.

Problemi correlati