2014-04-12 25 views
6

Nie mam tego w głowie i zastanawiałem się, czy ktoś może mi w tym pomóc.Próbuję użyć INNER JOIN i GROUP BY SQL z funkcją SUM, nie działa

Mam 2 tabele nazywane RES_DATA i INV_DATA

RES_DATA Zawiera mój klient jak poniżej

CUSTOMER ID | NAME 

1, Robert 
2, John 
3, Peter 

INV_DATA Zawiera fakturach jako Poniżej

INVOICE ID | CUSTOMER ID | AMOUNT 

100, 1, £49.95 
200, 1, £105.95 
300, 2, £400.00 
400, 3, £150.00 
500, 1, £25.00 

Próbuję napisać oświadczenie SELECT Które dadzą mi wyniki jak poniżej.

CUSTOMER ID | NAME | TOTAL AMOUNT 

1, Robert, £180.90 
2, John, £400.00 
3, Peter, £150.00 

Chyba muszę 2 sprzężenia wewnętrzne jakoś Dodaj tabele i wartości sumy faktur tabeli pogrupowane według tabeli Customer ale szczerze, że jestem czegoś brakuje. Nie mogę nawet zbliżyć się do wyników, których potrzebuję.

+0

jaką SQL? Serwer SQL? –

Odpowiedz

13

To powinno zadziałać.

SELECT a.[CUSTOMER ID], a.[NAME], SUM(b.[AMOUNT]) AS [TOTAL AMOUNT] 
FROM RES_DATA a INNER JOIN INV_DATA b 
ON a.[CUSTOMER ID]=b.[CUSTOMER ID] 
GROUP BY a.[CUSTOMER ID], a.[NAME] 

Testowałem go z SQL Fiddle przeciwko SQL Server 2008: http://sqlfiddle.com/#!3/1cad5/1

zasadzie to, co się tutaj dzieje jest to, że ze względu na przyłączyć, dostajesz ten sam wiersz na „lewo” (czyli od RES_DATA tabela) dla każdego wiersza z "prawej" (tj. Tabeli INV_DATA), który ma tę samą wartość [CUSTOMER ID]. Gdy pogrupujesz według kolumn po lewej stronie, a następnie zsumujesz tylko kolumnę [AMOUNT] z prawej strony, zachowa ona jeden rząd nietknięty po lewej stronie i podsumuje pasujące wartości z prawej strony.

+0

Dziękuję bardzo roryap, który działał po raz pierwszy. Teraz, aby to zrozumieć! – Rob4236

+0

@ user3526836 - Nie ma za co. Zaktualizowałem swoją odpowiedź, aby wyjaśnić, co się dzieje. Mam nadzieję, że to pomoże. –

0

Zastosowanie Podzapytanie

SELECT * FROM RES_DATA inner join (SELECT [CUSTOMER ID], sum([TOTAL AMOUNT]) FROM INV_DATA group by [CUSTOMER ID]) T on RES_DATA.[CUSTOMER ID] = t.[CUSTOMER ID]

+3

Ta odpowiedź będzie miała wydajność 'O (n^2)', op. do grupy, która będzie miała "O (n)" – Hogan

+0

Rzeczywiście, ale szukał wyniku, a nie wydajności. –

4

dwa sposoby, aby to zrobić ...

GROUP BY

SELECT RES.[CUSTOMER ID], RES,NAME, SUM(INV.AMOUNT) AS [TOTAL AMOUNT] 
FROM RES_DATA RES 
JOIN INV_DATA INV ON RES.[CUSTOMER ID] INV.[CUSTOMER ID] 
GROUP BY RES.[CUSTOMER ID], RES,NAME 

OVER

SELECT RES.[CUSTOMER ID], RES,NAME, 
     SUM(INV.AMOUNT) OVER (PARTITION RES.[CUSTOMER ID]) AS [TOTAL AMOUNT] 
FROM RES_DATA RES 
JOIN INV_DATA INV ON RES.[CUSTOMER ID] INV.[CUSTOMER ID]