web-dev-qa-db-de.com

Versuch, INNER JOIN und GROUP BY SQL mit SUM-Funktion zu verwenden, funktioniert nicht

Ich verstehe das nicht und frage mich, ob mir jemand dabei helfen kann.

Ich habe 2 Tabellen namens RES_DATA und INV_DATA

RES_DATA Enthält meinen Kunden wie folgt

CUSTOMER ID | NAME

1, Robert
2, John
3, Peter

INV_DATA enthält die unten aufgeführten RECHNUNGEN

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 STATEMENT zu schreiben, die mir die Ergebnisse als Unten zeigt.

CUSTOMER ID | NAME | TOTAL AMOUNT

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

Ich denke, ich brauche 2 INNER JOINS JOY irgendwie, um die Tabellen und die Summenwerte der Tabelle INVOICES zu addieren. Ich kann die Ergebnisse, die ich brauche, nicht annähernd erreichen.

11
Rob4236

Das 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]

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

Grundsätzlich geschieht hier, dass Sie aufgrund des Joins für jede Zeile auf der "rechten" (dh der RES_DATA-Tabelle), die denselben INV_DATA-Wert hat, dieselbe Zeile auf der linken Seite (dh aus der [CUSTOMER ID]-Tabelle) erhalten . Wenn Sie nur nach den Spalten auf der linken Seite gruppieren und dann eine Summe der Spalte [AMOUNT] von der rechten Seite aus durchführen, bleibt die eine Zeile von der linken Seite intakt und summiert die entsprechenden Werte von der rechten Seite.

18
rory.ap

Zwei Möglichkeiten, es zu tun ...

GRUPPIERE NACH

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

ÜBER

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]
6
Hogan

Unterabfrage verwenden

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]