web-dev-qa-db-fra.com

Somme SQL Plusieurs lignes en une

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
8
Jason

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.

0
Jason

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.

10

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
7
Dave Zych

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.

3
jvicab

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
1
ubanerjea