2012-12-01 7 views
6

Mam problem z zapytaniem SQL.
mam TABLEA:Suma kwot w różnych tabelach

productA priceA 
P1  18 
P2  35 
P1  22 
P2  19 

a także tableB:

productB priceB 
P1  3 
P2  15 
P1  80 
P2  96 

chcę w wyniku sumę dwóch produktów od 2 tabel.

product price 
P1  123 
P2  165 

Chcę zsumować sumy dwóch tabel.
Próbuję tego zapytania, ale jest ono nieprawidłowe.

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 

Proszę mi pomóc.

+0

Czy możesz wyjaśnić, co masz na myśli, mówiąc "źle" - co powoduje zapytanie? Czy 2 podkategorie zwracają prawidłowe wyniki dla każdego produktu? –

+0

Jaki jest Twój silnik? – Sebas

Odpowiedz

3

Można użyć union scalić tabele i group by na wynik:

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

To działa! Dziękuję Ci! :) – vaka

+0

Podniecam cię, ponieważ masz "związek wszystko". –

1

to całkiem dosłownie suma kwot:

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

To rozwiązanie nie jest poprawne, ponieważ 'union' usuwa duplikaty. Powinieneś mieć 'union all'. –

+0

@GordonLinoff Damn, masz rację! Zazwyczaj jestem nazistą dla "związku wszystko". Dzięki za wskazanie tego. (Naprawiłem zapytanie) – Bohemian

0

Ponieważ dołączyć wydaje się naturalnym sposób podejścia do tego problemu, tutaj jest rozwiązanie z join zamiast union. agreguje to dane w podzapytania, potem dołącza wyniki razem:

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 

Używam full outer join w przypadku tabel mają różne zestawy produktów. W rezultacie muszę mieć coalesce w oświadczeniu select.