J'ai besoin d'aide avec la fonction SOMME. J'essaie de résumer les montants de la facture pour le même compte en un total global, mais les résultats que je reçois montrent que ma colonne SOMME ne fait que multiplier ma première colonne par 3.
Voici ce que je veux comme résultats pour mes données fictives:
AccountNumber Bill BillDate
1 100.00 1/1/2013
1 150.00 2/1/2013
1 200.00 3/1/2013
2 75.00 1/1/2013
2 100.00 2/1/2013
Question:
SELECT AccountNumber, Bill, BillDate, SUM(Bill)
FROM Table1
GROUP BY AccountNumber, Bill, BillDate
AccountNumber Bill BillDate SUM(Bill)
1 100.00 1/1/2013 450.00
1 150.00 2/1/2013 450.00
1 200.00 3/1/2013 450.00
2 75.00 1/1/2013 175.00
2 100.00 2/1/2013 175.00
OR
AccountNumber Bill SUM(Bill)
1 100.00 450.00
2 75.00 175.00
Je préférerais avoir les deux résultats si possible.
Voici ce que je reçois:
Ma colonne SOMME ne fait que multiplier par trois, elle ne fait pas la somme des données basées sur le compte Numéro.
AccountNumber Bill BillDate SUM(Bill)
1 100.00 1/1/2013 300.00
1 150.00 2/1/2013 450.00
1 200.00 3/1/2013 600.00
2 75.00 1/1/2013 225.00
2 100.00 2/1/2013 300.00
Merci pour vos réponses. Il s'avère que mon problème était un problème de base de données avec des entrées en double, pas avec ma logique. Une synchronisation rapide de table a corrigé le problème et la fonction SOMME a fonctionné comme prévu. Toutes ces connaissances restent utiles pour la fonctionnalité SOMME et méritent d'être lues si vous rencontrez des difficultés pour l'utiliser.
Si vous ne souhaitez pas grouper votre résultat, utilisez une fonction de fenêtre.
Vous n'avez pas indiqué votre SGBD, mais il s'agit d'ANSI SQL:
SELECT AccountNumber,
Bill,
BillDate,
SUM(Bill) over (partition by accountNumber) as account_total
FROM Table1
order by AccountNumber, BillDate;
Voici un SQLFiddle: http://sqlfiddle.com/#!15/2c35e/1
Vous pouvez même ajouter une somme courante en ajoutant:
sum(bill) over (partition by account_number order by bill_date) as sum_to_date
qui vous donnera le total jusqu'à la date de la ligne en cours.
Vous groupez avec BillDate
, mais les dates de la facture sont différentes pour chaque compte et vos lignes ne sont donc pas regroupées. Si vous y réfléchissez, cela n’a même aucun sens. Ce sont des projets de loi différents, et ils ont des dates différentes. Il en va de même pour la Bill
- vous essayez de faire la somme des factures d'un compte, pourquoi voudriez-vous les regrouper par cela?
Si vous laissez BillDate
et Bill
hors des clauses select et group by, vous obtiendrez les résultats corrects.
SELECT AccountNumber, SUM(Bill)
FROM Table1
GROUP BY AccountNumber
Vous devez regrouper en fonction du champ que vous souhaitez appliquer à SUM et ne pas inclure dans SELECT un champ autre que plusieurs valeurs de lignes, telles que COUNT, SUM, AVE, etc., car si vous incluez un champ de facture dans l'ensemble des lignes sera affiché, étant presque sans signification et déroutant.
Cela retournera la somme des factures par numéro de compte:
SELECT SUM(Bill) FROM Table1 GROUP BY AccountNumber
Vous pouvez ajouter d'autres clauses telles que WHERE, ORDER BY, etc. selon vos besoins.
J'ai essayé cela, mais la requête ne s'exécutera pas et ne me dira pas que mon champ n'est pas valide dans l'instruction select, car il ne figure dans aucune fonction d'agrégat ni dans la clause GROUP BY. Cela me force à le garder ici. Y a-t-il un moyen de contourner ceci?
Vous devez faire une auto-jointure. Vous ne pouvez pas à la fois regrouper et conserver des données non agrégées dans la même sous-requête. Par exemple.
select q2.AccountNumber, q2.Bill, q2.BillDate, q1.BillSum
from
(
SELECT AccountNumber, SUM(Bill) as BillSum
FROM Table1
GROUP BY AccountNumber
) q1,
(
select AccountNumber, Bill, BillDate
from table1
) q2
where q1.AccountNumber = q2.AccountNumber