2014-04-12 9 views
6

Non riesco a capirlo, e mi chiedevo se qualcuno potrebbe essere in grado di aiutarmi con questo.Tentativo di utilizzare INNER JOIN e GROUP BY SQL con SUM Function, Not

Ho 2 tabelle chiamato RES_DATA e INV_DATA

RES_DATA contiene il mio cliente, come di seguito

CUSTOMER ID | NAME 

1, Robert 
2, John 
3, Peter 

INV_DATA Contiene le loro fatture come qui sotto

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 

Sto cercando di scrivere una dichiarazione SELECT Quale mi darà i risultati come sotto.

CUSTOMER ID | NAME | TOTAL AMOUNT 

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

Penso di aver bisogno 2 inner join In qualche modo per aggiungere le tabelle e valori somma dei tabella Fatture raggruppati per la tabella Customer ma onestamente penso che mi manca qualcosa. Non posso nemmeno avvicinarmi ai risultati di cui ho bisogno.

+0

che tipo di SQL? Server SQL? –

risposta

13

Questo dovrebbe funzionare.

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] 

ho provato con SQL Fiddle contro SQL Server 2008: http://sqlfiddle.com/#!3/1cad5/1

In sostanza quello che sta succedendo qui è che, a causa del join, si stanno ottenendo stessa riga sulla "sinistra" (cioè dal Tabella RES_DATA) per ogni riga sulla "destra" (ovvero la tabella INV_DATA) con lo stesso valore [CUSTOMER ID]. Quando si raggruppano solo le colonne sul lato sinistro e quindi si esegue una somma della sola colonna [AMOUNT] dal lato destro, mantiene intatta la riga da sinistra e somma i valori corrispondenti dal lato destro.

+0

Grazie mille roryap che ha funzionato per la prima volta. Ora capisci questo! – Rob4236

+0

@ user3526836 - Prego. Ho aggiornato la mia risposta per chiarire cosa sta succedendo. Spero che sia d'aiuto. –

0

Usa 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

Questa risposta avrà la performance 'O (n^2)', come op. a un gruppo di cui o sopra che avrà 'O (n)' – Hogan

+0

In effetti, ma stava cercando un risultato, non per le prestazioni. –

4

due modi per farlo ...

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 

OLTRE

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]