2014-04-12 5 views
6

Ich bin nicht dabei und fragte mich, ob jemand mir dabei helfen könnte.Der Versuch, INNER JOIN und GROUP BY SQL mit SUM Funktion zu verwenden, die nicht funktioniert

Ich habe 2 Tabellen genannt RES_DATA und INV_DATA

RES_DATA Enthält meine Kunden wie unten

CUSTOMER ID | NAME 

1, Robert 
2, John 
3, Peter 

INV_DATA Enthält ihre Rechnungen als unten

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 

Ich versuche, eine SELECT Erklärung zu schreiben, Was mir die Ergebnisse als Below geben wird.

CUSTOMER ID | NAME | TOTAL AMOUNT 

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

Ich glaube, ich brauche 2 innere Joins Irgendwie die Tabellen und Summenwerte der Tabelle Rechnungen durch den Kunden Tabelle ZUSAMMEN hinzufügen, aber ehrlich gesagt glaube, ich bin etwas fehlt. Kann den Ergebnissen, die ich brauche, nicht einmal nahe kommen.

+0

welche Art von SQL? SQL Server? –

Antwort

13

Dies sollte funktionieren.

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] 

Getestet habe ich es mit SQL Fiddle gegen SQL Server 2008: http://sqlfiddle.com/#!3/1cad5/1

Im Grunde passiert hier was ist das, weil die Verbindung, Sie werden immer die gleiche Zeile auf „links“ (dh von der RES_DATA Tabelle) für jede Zeile auf der "richtigen" (dh die INV_DATA Tabelle), die den gleichen [CUSTOMER ID] Wert hat. Wenn Sie nur die Spalten auf der linken Seite gruppieren und dann nur die Spalte [AMOUNT] von der rechten Seite aus addieren, wird die eine Zeile von der linken Seite intakt gehalten und die übereinstimmenden Werte von der rechten Seite zusammengefasst.

+0

Vielen Dank Roryap, die zum ersten Mal funktionierte. Nun, dies zu verstehen! – Rob4236

+0

@ user3526836 - Gern geschehen. Ich habe meine Antwort aktualisiert, um deutlicher zu machen, was vor sich geht. Ich hoffe es hilft. –

0

Verwenden subquery

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

Diese Antwort wird 'O (n^2)' Leistung haben, als Op. zu einer Gruppe von oder über die wird 'O (n)' – Hogan

+0

In der Tat, aber er war auf der Suche nach einem Ergebnis, nicht für die Leistung. –

4

zwei Möglichkeiten, es zu tun ...

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]