OVH Cloud OVH Cloud

Group by sur des agrégats

7 réponses
Avatar
Marc Mendez
Bonjour,

J'ai constaté que sous SqlServer, il n'était pas possible de faire de "group
by" en indiquant un n° de colonne.
Exemple (complètement débile, mais juste pour qu'on parle de la même chose)

SELECT col1, sum(x) from table group by 2

j'ai essayé de mettre des alias sur les colonnes de type agrégat, mais rien
à faire.

Une solution ??

Merci

7 réponses

Avatar
Patrice
Je viens de faire un essai en 2000. Je dirais que c'est justement parce que
le group by utilise nécessairement un nom de colonne (et n'accepte donc pas
les alias), contrairement au order by.

A priori on peut approcher cela avec une sous-requête mais cela donne bien
sûr quelque chose de plus compliqué. Quel est le problème que pose
l'utilisation du nom de la colonne ?

--
Patrice

"Marc Mendez" a écrit dans le message de news:
4505706c$0$630$
Bonjour,

J'ai constaté que sous SqlServer, il n'était pas possible de faire de
"group
by" en indiquant un n° de colonne.
Exemple (complètement débile, mais juste pour qu'on parle de la même
chose)

SELECT col1, sum(x) from table group by 2

j'ai essayé de mettre des alias sur les colonnes de type agrégat, mais
rien
à faire.

Une solution ??

Merci




Avatar
Fred BROUARD
Bonjour,

Marc Mendez a écrit :
Bonjour,

J'ai constaté que sous SqlServer, il n'était pas possible de faire de "group
by" en indiquant un n° de colonne.
Exemple (complètement débile, mais juste pour qu'on parle de la même chose)

SELECT col1, sum(x) from table group by 2

j'ai essayé de mettre des alias sur les colonnes de type agrégat, mais rien
à faire.



C'est parfaitement normal car conforme à la norme SQL. SQL est un
langage normalisé depuis 1986 ! on en est à la norme SQL 2003 en passant
par SQL 2 (1992) et SQL 3 (1999).

Or la norme précise que le groupage doit se faire exclusivement sur
l'expression. La précision de la position ordinale ne peut se faire que
pour la clause ORDER BY, de même pour les alias d'expression.

SQL Server est l'un des SGBDR avec IBM DB2 les plus respectueux de la
norme... MySQL, Access et Oracle n'ont que peu de respect de la norme
SQL et inventent des expressions illogiques !


Une solution ??



Mettez l'expression.

Mais votre exemple est syntaxiquement incorrect !

Voici cependant un exemple syntaxiquement correct :
SELECT SUM(Col1), Col2 + Col3
FROM MaTable
GROUP BY Col2 + Col3


Merci





Pour apprendre SQL, mon site, comme mes bouquins peuvent vous y aider !

A +


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Marc Mendez
"Patrice" a écrit dans le message de
news:
Je viens de faire un essai en 2000. Je dirais que c'est justement parce


que
le group by utilise nécessairement un nom de colonne (et n'accepte donc


pas
les alias), contrairement au order by.

A priori on peut approcher cela avec une sous-requête mais cela donne bien
sûr quelque chose de plus compliqué. Quel est le problème que pose
l'utilisation du nom de la colonne ?




Bonjour,

Parce que l'expression sur laquelle je dois faire un group by n'est pas
forcément une colonne ! Voir mon exemple!
Avatar
Marc Mendez
"Fred BROUARD" a écrit dans le message de
news:%
Bonjour,


C'est parfaitement normal car conforme à la norme SQL. SQL est un
langage normalisé depuis 1986 ! on en est à la norme SQL 2003 en passant
par SQL 2 (1992) et SQL 3 (1999).

Or la norme précise que le groupage doit se faire exclusivement sur
l'expression. La précision de la position ordinale ne peut se faire que
pour la clause ORDER BY, de même pour les alias d'expression.

SQL Server est l'un des SGBDR avec IBM DB2 les plus respectueux de la
norme... MySQL, Access et Oracle n'ont que peu de respect de la norme
SQL et inventent des expressions illogiques !



Bonjour,

illogique ma parait un peu fort ! Si je reste sur cet exemple, le n° ordinal
me parait plus facile à maintenir.
Certes, on pourra toujours rétorquer que si on décale les colonnes, il faut
penser à décaler les group by
(bien que généralement, je mets les colonnes de group by en début de SELECT,
comme ça, pas de décalage si j'ajoute des colonnes)
Mais suivant la norme, si tu as besoin en plus de récupérer la valeur
utilisé pour le group by, on se retrouve avec l'expression à 2 endroits dans
la requête...
donc, si modif, il faut penser à le changer aux 2 endroits...

de toute façon, l'une ou l'autre des solutions présente ses avantages et
inconvénients. tout dépend de ce qu'on veut faire et de la manière dont on
travaille.

Voici cependant un exemple syntaxiquement correct :
SELECT SUM(Col1), Col2 + Col3
FROM MaTable
GROUP BY Col2 + Col3




Ok, merci, ça répond parfaitement à ma question !

Pour apprendre SQL, mon site, comme mes bouquins peuvent vous y aider !




Apprendre, non, ça va (ok, je ne connais pas les normes par coeur, je
confie..., mais j'arrive encore à bien me débrouiller :) ), mais je note le
site !

A +


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************


Avatar
Pierre BOUSQUET
sur l'alias ce serait "plus logique"

Marc Mendez a présenté l'énoncé suivant :
"Fred BROUARD" a écrit dans le message de
news:%
Bonjour,


C'est parfaitement normal car conforme à la norme SQL. SQL est un
langage normalisé depuis 1986 ! on en est à la norme SQL 2003 en passant
par SQL 2 (1992) et SQL 3 (1999).

Or la norme précise que le groupage doit se faire exclusivement sur
l'expression. La précision de la position ordinale ne peut se faire que
pour la clause ORDER BY, de même pour les alias d'expression.

SQL Server est l'un des SGBDR avec IBM DB2 les plus respectueux de la
norme... MySQL, Access et Oracle n'ont que peu de respect de la norme
SQL et inventent des expressions illogiques !



Bonjour,

illogique ma parait un peu fort ! Si je reste sur cet exemple, le n° ordinal
me parait plus facile à maintenir.
Certes, on pourra toujours rétorquer que si on décale les colonnes, il faut
penser à décaler les group by
(bien que généralement, je mets les colonnes de group by en début de SELECT,
comme ça, pas de décalage si j'ajoute des colonnes)
Mais suivant la norme, si tu as besoin en plus de récupérer la valeur
utilisé pour le group by, on se retrouve avec l'expression à 2 endroits dans
la requête...
donc, si modif, il faut penser à le changer aux 2 endroits...

de toute façon, l'une ou l'autre des solutions présente ses avantages et
inconvénients. tout dépend de ce qu'on veut faire et de la manière dont on
travaille.

Voici cependant un exemple syntaxiquement correct :
SELECT SUM(Col1), Col2 + Col3
FROM MaTable
GROUP BY Col2 + Col3




Ok, merci, ça répond parfaitement à ma question !

Pour apprendre SQL, mon site, comme mes bouquins peuvent vous y aider !




Apprendre, non, ça va (ok, je ne connais pas les normes par coeur, je
confie..., mais j'arrive encore à bien me débrouiller :) ), mais je note le
site !

A +


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************





--
Pierre BOUSQUET

" Ne me dites pas que ce problème est difficile.
S'il n'était pas difficile, ce ne serait pas un problème. "
Avatar
Patrice
Ok je pensais que le 2 était une erreur car je pense de toute façon qu'un
tel regroupement n'est pas possible (que veut dire regrouper par sum(x)
alors que sum(x) ne produit qu'une seule valeur ??? plus col1 ne pourrait
pas être sélectionné dans la liste des colonnes car il n'est possible de
sélectionner qu'une colonne qui sert de regroupement ou une fonction
d'aggrégation)...

Je pense que le mieux serait de revenir à ce que tu cherches à faire car
j'ai l'impression qu'il y a plus un problème d'angle d'attaque que de
syntaxe...

Eventuellement, il serait possible de faire quelque chose de similaire en
passant par des sous-requêtes. Quelque chose comme :

SELECT COUNT(*),m FROM
(SELECT pk, SUM(Valeur) AS m
FROM MaTable
GROUP BY pk)
AS SR
GROUP BY m

qui fait une somme en regroupant par pk puis comptant le nombre de fois où
chaque somme est produite. Est-ce quelque chose de ce style que tu cherches
?

--
Patrice

"Marc Mendez" a écrit dans le message de news:
45068304$0$17174$

"Patrice" a écrit dans le message de
news:
Je viens de faire un essai en 2000. Je dirais que c'est justement parce


que
le group by utilise nécessairement un nom de colonne (et n'accepte donc


pas
les alias), contrairement au order by.

A priori on peut approcher cela avec une sous-requête mais cela donne
bien
sûr quelque chose de plus compliqué. Quel est le problème que pose
l'utilisation du nom de la colonne ?




Bonjour,

Parce que l'expression sur laquelle je dois faire un group by n'est pas
forcément une colonne ! Voir mon exemple!




Avatar
Marc Mendez
"Patrice" a écrit dans le message de
news:
Ok je pensais que le 2 était une erreur car je pense de toute façon qu'un
tel regroupement n'est pas possible (que veut dire regrouper par sum(x)
alors que sum(x) ne produit qu'une seule valeur ??? plus col1 ne pourrait
pas être sélectionné dans la liste des colonnes car il n'est possible de
sélectionner qu'une colonne qui sert de regroupement ou une fonction
d'aggrégation)...



L'exemple était stupide (tout à fait d'accord pour le regroupement), mais
juste illustratif


Je pense que le mieux serait de revenir à ce que tu cherches à faire car
j'ai l'impression qu'il y a plus un problème d'angle d'attaque que de
syntaxe...



Oh, non, je peux te rassurer ! Les requêtes de l'application que nous
migrons sont "on-ne-peut-plus" costaud et murement réfléchies. Si déjà, dans
le moteur de base d'origine, nous avions pu simplifier le pb, cela aurait
été fait depuis un moment :)
Mais j'insiste, l'exemple que j'ai donné était absurde (j'aime l'auto
flagélation !).

Eventuellement, il serait possible de faire quelque chose de similaire en
passant par des sous-requêtes. Quelque chose comme :

SELECT COUNT(*),m FROM
(SELECT pk, SUM(Valeur) AS m
FROM MaTable
GROUP BY pk)
AS SR
GROUP BY m

qui fait une somme en regroupant par pk puis comptant le nombre de fois où
chaque somme est produite. Est-ce quelque chose de ce style que tu


cherches
?



Les sous-requêtes manquent dans la version de base de données que nous
utilisons en ce moment. J'ai eu l'occasion de les utiliser pour me sortir de
quelques ornières sous Oracle, et c'est souvent génial ! J'avoue que je suis
sûr que certaines problèmes de group by seraient réglé par cette solution,
mais cela poserait de grave problème de réécriture du logiciel, dans la
mesure où l'autre moteur de base de les gère pas... mais bon, c'est un autre
pb, bien plus gros que ma question initiale.
De toute façon, la réponse que tu m'as donné me satisfait pleinement !

MErci des infos !