mise en classe d'un résultat

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : mise en classe d'un résultat

Re: mise en classe d'un résultat

par pierreC » 25 août 2009, 13:04

Woua merci bcp pour la réponse très complète.

On arrive donc à même conclusion.


Mais je vais en ajouté une couche :
Si je ne veux compter que les clients_mois > 30 :

Code : Tout sélectionner

SELECT m.mois, count(cm.mois) FROM mois m left join `clients_mois` cm on m.mois = cm.mois WHERE cm.mois > 30 Group By m.mois
Dans ce cas le WHERE va me virer le mois 1 , dommage.

Faut t'il donc faire une sous-requete qui contient le where puis de cette sous-requete faire une jointure pour forcer l'ajout des mois ... ca devient compliqué tout ca, mais je voie pas d'autre solution :

Code : Tout sélectionner

SELECT m.mois, count(cm.mois) FROM ( SELECT * FROM clients_mois WHERE `n°client` > 30) as cm RIGHT JOIN `mois` m on cm.mois = m.mois Group By m.mois

En fait il faudrait un truc du genre :

Code : Tout sélectionner

SELECT m.mois, count(cm.mois) FROM mois m left join `clients_mois` cm on m.mois = cm.mois WHERE cm.mois > 30 WITH GROUP BY m.mois IN (1,2,3,4,5,6,7,8,9,10,11,12)
un group by sur un champ selon une liste de valeur fournit.

Re: mise en classe d'un résultat

par sadeq » 25 août 2009, 09:40

Bonjour,

Il te faut effectivement créer une table de référence qui contient la liste des mois puis faire une jointure externe avec ta table pour faire le comptage. C'est la jointure externe qui permettra de compter un zéro pour les mois absents de ta table de travail.

Voici comment, dans le cadre d'un exemple simple:

Voici la structure de la base de données de l'exemple qui contient 2 tables : la table des mois et celle qui contient les n° des clients par mois.

Code : Tout sélectionner

-- phpMyAdmin SQL Dump -- version 3.1.1 -- http://www.phpmyadmin.net -- -- Serveur: localhost -- Généré le : Mar 25 Août 2009 à 09:28 -- Version du serveur: 5.1.30 -- Version de PHP: 5.2.8 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; -- -- Base de données: `test` -- -- -------------------------------------------------------- -- -- Structure de la table `clients_mois` -- CREATE TABLE IF NOT EXISTS `clients_mois` ( `n°client` int(11) NOT NULL, `mois` int(11) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -- Contenu de la table `clients_mois` -- INSERT INTO `clients_mois` (`n°client`, `mois`) VALUES (25, 1), (26, 1), (29, 1), (32, 2), (65, 2), (69, 4); -- -------------------------------------------------------- -- -- Structure de la table `mois` -- CREATE TABLE IF NOT EXISTS `mois` ( `mois` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -- Contenu de la table `mois` -- INSERT INTO `mois` (`mois`) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12);
Voici donc la requête SQL qui compte:

Code : Tout sélectionner

SELECT m.mois, count(cm.mois) FROM mois m left join `clients_mois` cm on m.mois = cm.mois Group By m.mois
Le résultat est :

Code : Tout sélectionner

mois count(cm.mois) 1 3 2 2 3 0 4 1 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0

mise en classe d'un résultat

par pierreC » 24 août 2009, 12:56

Hello à tous

Tout d'abord la classe dont je parle n'a rien avoir avoir une classe de programmation. C'est un terme de stat.

L'idée est de compter par exemple le nombre de client inscrit chaque mois.
n° cli mois
25 1
26 1
29 1
32 2
65 2
69 4
...
...

Dans ce cas la requete : SELECT mois,count(*) FROM clients GROUP BY mois me retrounerai :
1 3
2 2
4 1

Mais je voudrais également que ca me "mette en classe" selon une liste de mois fournit, et que pour les mois ou il n'y a aucun résultat ca m'affiche zéro :
1 3
2 2
3 0
4 1
5 0
....
....


Je connais une solution qui est de crée une table de référence sur laquelle je fait une jointure. Mais quand j'ai un group by sur 4 colonnes, ca fait 4 jointures, ca fait 4 tables de référence à créer = ca devient compliqué

Des idées ?