OVH Cloud OVH Cloud

Groupby Sum

2 réponses
Avatar
odelacour
Bonjour je travaille actuellement sur une base SQL Server et rencontre
certain probl=E8me avec les fonctions d'agr=E9gation et de regroupement:
=E7a n'agregue et ne regroupe rien du tout !! :-)

D=E9monstration sur une table toute simple:

create table VOITURE
(
id int,
marque varchar(20),
Montant int
)

select * from voiture


id | Marque | Montant
-------------------------------------
1 | Renault | 6600
2 | Peugeot | 7300
3 | Lada | 500
4 | Mercedes | 10000
6 | Mercedes | 12000
7 | Renault | 6500
8 | Peugeot | 7500


Je lance le regroupement et cherche =E0 obtenir la somme des montants /
marque de voiture :

select id, marque, SUM(montant)
from voiture
group by marque


Et l=E0 SQL Server me retourne l'erreure suivante:

"Serveur : Msg 8120, Niveau 16, =C9tat 1, Ligne 23
La colonne 'voiture.id n'est pas valide dans la liste de s=E9lection
parce qu'elle n'est pas contenue dans une fonction d'agr=E9gation ou
dans la clause GROUP BY."

Je n'ai jamais compris pourquoi (si quelqu'un peux m'expliquer au
passage je lui dit un grand merci) on doit retrouver dans la clause
GROUP BY les champs
contenus dans la clause SELECT ... enfin on =E9coute le server et on
recommence :

select id, marque, SUM(montant)
from voiture
group by marque, id

1 | Renault | 6600
2 | Peugeot | 7300
3 | Lada | 500
4 | Mercedes | 10000
6 | Mercedes | 12000
7 | Renault | 6500
8 | Peugeot | 7500

Bref aucun effet ... MAX et Min ne fonctionne pas non plus.
=20
J'ai grand besoin d'aide ...
En vous remerciant,=20

Olivier

2 réponses

Avatar
BVesan
Bonjour,
Le problème que vous rencontrez est le suivant:
SQL Server agrège correctement, mais vous n'effectuez que des agrégats d'une
ligne !!!

La présence de la colonne ID (qui a priori est votre identifiant unique de
véhicule) empêche le réel agrégat.
Il suffit donc de supprimer cette colonne des clauses SELECT et GROUP BY:

select marque, SUM(montant)
from voiture
group by marque



Benjamin

"" a écrit :

Bonjour je travaille actuellement sur une base SQL Server et rencontre
certain problème avec les fonctions d'agrégation et de regroupement:
ça n'agregue et ne regroupe rien du tout !! :-)

Démonstration sur une table toute simple:

create table VOITURE
(
id int,
marque varchar(20),
Montant int
)

select * from voiture


id | Marque | Montant
-------------------------------------
1 | Renault | 6600
2 | Peugeot | 7300
3 | Lada | 500
4 | Mercedes | 10000
6 | Mercedes | 12000
7 | Renault | 6500
8 | Peugeot | 7500


Je lance le regroupement et cherche à obtenir la somme des montants /
marque de voiture :

select id, marque, SUM(montant)
from voiture
group by marque


Et là SQL Server me retourne l'erreure suivante:

"Serveur : Msg 8120, Niveau 16, État 1, Ligne 23
La colonne 'voiture.id n'est pas valide dans la liste de sélection
parce qu'elle n'est pas contenue dans une fonction d'agrégation ou
dans la clause GROUP BY."

Je n'ai jamais compris pourquoi (si quelqu'un peux m'expliquer au
passage je lui dit un grand merci) on doit retrouver dans la clause
GROUP BY les champs
contenus dans la clause SELECT ... enfin on écoute le server et on
recommence :

select id, marque, SUM(montant)
from voiture
group by marque, id

1 | Renault | 6600
2 | Peugeot | 7300
3 | Lada | 500
4 | Mercedes | 10000
6 | Mercedes | 12000
7 | Renault | 6500
8 | Peugeot | 7500

Bref aucun effet ... MAX et Min ne fonctionne pas non plus.

J'ai grand besoin d'aide ...
En vous remerciant,

Olivier




Avatar
odelacour
Merci pour ton aide Benjamin.

Tu as tout à fait raison, grâce à toi, j'ai résolu mon problème
:-)

@+