web-dev-qa-db-fra.com

Essayer d'utiliser INNER JOIN et GROUP BY SQL avec la fonction SUM, ne fonctionne pas

Je ne comprends pas ce que je pense et je me demandais si quelqu'un pourrait peut-être m'aider avec cela.

J'ai 2 tables appelées RES_DATA et INV_DATA

RES_DATA contient mon client comme ci-dessous

CUSTOMER ID | NAME

1, Robert
2, John
3, Peter

INV_DATA contient leurs factures comme ci-dessous

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

J'essaie d'écrire une déclaration SELECT qui me donnera les résultats comme ci-dessous.

CUSTOMER ID | NAME | TOTAL AMOUNT

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

Je pense que j'ai besoin de 2 INNER JOINS pour ajouter les tables et les valeurs SOMME de la table INVOICES GROUPED BY BY Customer Table, mais je pense sincèrement que quelque chose me manque. Je ne peux même pas me rapprocher des résultats dont j'ai besoin.

11
Rob4236

Cela devrait marcher.

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]

Je l'ai testé avec SQL Fiddle contre SQL Server 2008: http://sqlfiddle.com/#!3/1cad5/1

Fondamentalement, ce qui se passe ici, c'est que, à cause de la jointure, vous obtenez la même ligne à gauche (c'est-à-dire à partir de la table RES_DATA) pour chaque ligne à droite (à savoir la table INV_DATA) qui a la même valeur [CUSTOMER ID]. . Lorsque vous regroupez uniquement les colonnes du côté gauche, puis que vous faites la somme de la colonne [AMOUNT] du côté droit, la ligne restante est intacte du côté gauche et les valeurs correspondantes sont résumées du côté droit.

18
rory.ap

Deux façons de le faire ...

PAR GROUPE

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

PLUS DE

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