Comment faire un Count() sans un group by interminable ?

olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 - 14 août 2009 à 13:06
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 - 25 déc. 2009 à 15:04
Bonjour

Est-il possible en MS SQL de faire un count sur un champ sans etre obligé d'integere tous les champs du select dans le group by


Code :
SELECT
c1,
count(c1),
c2,
c3,
c4,
.... etc
FROM T
GROUP BY c1;Comment peut on faire cela de maniere simple en MS SQL

En MySql c'est élémentaire, en MS Sql il semblerait que ce soit impossible ??

Merci de votre aide
A voir également:

14 réponses

nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 1
14 août 2009 à 14:26
Tu es sur que c'est possible en MySQL ? c'est en dehors de toute logique et de toute cohérance. Ou alors c'est que Mysql ajoute implicitement tous les champs non aggrégé dans la clause group by.
SQL Server etant tres proche de la norme (contrairement a MySQL qui prend un peu trop de libertées a mon gout) il ne peut en aucun cas accepter de genre d'ecriture totalement incohérante et abérante.
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
14 août 2009 à 15:11
Salut

Je suis certain que c'est possible en MySql et c'est en plus TRES pratique

Exemple simple

SELECT
count(addrid),
ritstat.`date`,
ritstat.addrID
FROM
ritstat
group by (addrid)

J'ai le count des dates sur une adresse

SELECT
count(date),
ritstat.`date`,
ritstat.addrID
FROM
ritstat
group by (date)

J'ai le count des adresses sur une date
0
nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 1
14 août 2009 à 15:33
Ces synthaxe d'un point de vue Relationnel et SQL sont aberrantes.

Je vais installer un mysql pour voir ce que ca peut donner comme resultat mais du point de vu de la norme SQL et du modele relationnel sur lequel ce moteur est sensé etre construit cela n'a aucun sens.
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
14 août 2009 à 16:01
Sincérement

MySql a peut etre des défaut mais il a beaucoup de qualité aussi !

Et permettre ce genre de syntaxe quand on sait ce que l'on veut faire c'est franchement tres pratique !!
Et c'est souvent en voulant mettre trop de barrieres pour se proteger qu'on finit par se retrouver coincé dans un monde clos !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 1
14 août 2009 à 16:45
Je viens de faire un test apres installation de MySQL sur mon serveur de test.

J'ai créé une table du meme nom que la tienne avec 2 colonnes des noms que tu donnes, la premiere de type integer, l'autre de type datetime.

J'ai ensuite inseré tout un jeu de donnée en prenant soin de doublonner (j'ai 2 fois la ligne (1, '2007-01-01') par exemple.

J'ai ensuite executer tes requetes : Les resultats sont tout simplement INCOHERANTS ! pour ma ligne doublonnée j'ai un count a 4 !!!!!!!!!!

et de fait, j'ai bien 4 fois la date '2007-01-01' dans ma table mais en AUCUN CAS les addrID ne sont identiques,
Le retour de la requete avec count, date, addrID avec la valeur (4, '2007-01-01', 1) n'a donc strictement aucun SENS !

Non seulement la synthaxe est aberrante mais les resultats sont FAUX ! il n'y a pas dans ma table 4 fois la date '2007-01-01' pour l'addrID 1.

Voila ou mene ce genre de synthaxe permissive. J'espere sincerement que cette synthaxe n'est pas utiliser dans des logiciels comptables ou les utilisateurs de ces logiciels vont rapidement se retrouver en prison pour fraude fiscale ou detournement de fonds ou que sais je.
0
nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 1
14 août 2009 à 16:46
C'est peut etre pour ce genre de chose que le monde des SGBDR est clos justement. C'est justement ca qui garantie la cohérance des données.
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
14 août 2009 à 17:01
Tu as raison !

Mais j'avais dis

Et permettre ce genre de syntaxe quand on sait ce que l'on veut faire c'est franchement tres pratique !!

Dans mon cas, par construction je ne peux pas avoir de doublons Date+Adresses
0
nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 1
14 août 2009 à 17:05
Meme si je retire le doublon, j'obtiendrais alors une reponse de (3, 2007-01-01, 1) ce qui doit signifier que dans ma table j'ai 3 fois la ligne (2007-01-01 , 1) ce qui est tout aussi FAUX puisque je ne l'aurais plus qu'une seule fois ! La requete reste FAUSSE puisqu'elle créer de l'information FAUSSE !
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
14 août 2009 à 18:46
Mais non !

Ca signifie que tu a 3 records pour lesquels la date est 2007-01-01 peut importe l'addrID
0
nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 1
14 août 2009 à 18:49
Pourquoi avoir ce champs dans le select alors ?????
0
nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 1
14 août 2009 à 19:13
En fait la proposition (3, 2007-01-01, 1) est fausse mais la proposition (3, 2007-01-01) est elle vraie.

Donc la requete
SELECT
count(date),
ritstat.`date`,
ritstat.addrID
FROM
ritstat
group by (date)
Est FAUSSE car elle me dit (3, 2007-01-01, 1) c'est a dire le prédicat suivant : la table ritstat contient 3 lignes pour la date 2007-01-01 et l'addrID 1
mais la requete
SELECT
count(date),
ritstat.`date`,
FROM
ritstat
group by (date)
Est VRAIE car elle me dit (3, 2007-01-01) c'est a dire le prédicat suivant : la table ritstat contient 3 lignes pour la date 2007-01-01

Les SGBDR ne sorte pas du chapeau d'un magicien, ils sont basés sur le modele Relationnel et la logique des prédicats. Le fondement meme de cette logique est toute information présente dans une table a un instant T est VRAIE pour cet instant T. Hors le resultat d'une requete est une table donc les lignes qui resultent d'une requetes doivent etre vraies. Si ce n'est pas le cas la requete est fausse !!!

La valeure de addrID renvoyé par la requete est inexploitable car fausse et completement aberrante. C'est pour ca que les SGBDR serieux n'autorisent pas de tel synthaxe. Tu l'admet toi meme tu n'exploite d'ailleur pas cette information, c'est donc une perte de temps et de ressources que d'aller la chercher.

Pour une requete donnée utilisant des fonctions d'aggregation une colonnes doit donc OBLIGATOIREMENT etre soit aggrégée (via les fonction d'aggregation count(), max(), min(), avg(), ...) soit groupée dans la clause GROUP BY soit ABSENTE du select.
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
14 août 2009 à 20:52
Je comprends ce que tu explique mais ayant l'habitude de MySql ce me perturbe

J'ai une table societé avec +/- 15 champs a afficher dans un tableau dans ce tableau je veux aussi afficher le count des personnes lieés via une autre table

Par paresse d'ecriture je trouve qu'un bete join avec un count etait facile a faire !
0
dymsbess Messages postés 56 Date d'inscription mercredi 29 septembre 2004 Statut Membre Dernière intervention 4 janvier 2010 1
25 déc. 2009 à 12:47
J'adore ce genre de question. La solution passe peut-être par une jointure pour obtenir le détail par exemple. Tu peux exposer ton besoin avec un exemple concret STP.
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
25 déc. 2009 à 15:04
Oups !

C'est un vieux post

Si je me souvient bien du probleme
J'ai une table T1 contenant
F1,F2,F3,F5 .. F15
J'ai une table T2 liée par F1
Je voulais avoir le count de T2 par record T1
Et par extension en imaginant que dans T2 j'ai des masculin et féminin
Faire un count séparé F et M
En MySql je peux faire cela avec un bete group by sur 1 ou dex champs
Mais j'avoue que le problème n'est plus tres frais dans ma tete
0
Rejoignez-nous