Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/06/2011, 15h12   #1
Invité de passage
 
Inscription : septembre 2005
Messages : 17
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 17
Points : 4
Points : 4
Par défaut Table client, commande nombre de client avec n commandes

t_client (id_client, nom,...)
t_commande (id_commande, id_client, montant, ...)

Bonjour
je cherche à faire des statistiques sur le nombre de commande que passent les clients de mon application.
Je cherche à avoir comme résultats

Citation:

x clients avec 0 commandes
y clients avec 1 commandes
z clients avec 2 commandes
...
w clients avec >10 commandes.
J'ai pensé à faire parcourir la liste des clients, compter le nombre de commande pour chacun , et alimenter 11 compteurs en fonction du nombre de commandes trouvé, mais cette solution me semble trop bourrin.

est-ce-qu'il aurait une requête plus élégante ?
sakini est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 15h27   #2
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
Bonjour

ce serait bien d'indiquer le SGBD utilisé,
et de mettre le modèle de requête qui a été testée

Piste : Utilisez la fonction COUT en association avec la clause GROUP BY
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 15h38   #3
Invité de passage
 
Inscription : septembre 2005
Messages : 17
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 17
Points : 4
Points : 4
la SGBD sera mySQL.

Pour la requête
Code :
1
2
3
4
5
$sql="select distinct count(*) as nb from client,commande where client.id_client=commande.id_client group by commande.id_client";
$req=mysql_query($sql) OR die('Erreur SQL !'.$sql.'<br>'.mysql_error());
$row = mysql_fetch_array($req);
$dataNbRes=   $row['nb']; 
echo "<br>dataNbRes=$dataNbRes";
Le probleme est que j'obtiens je pense le nombre de catégorie mais je ne sais pas récupérer le nombre d'élément de chaque catégorie
sakini est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 15h45   #4
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
merçi, mais n'indiquez que la requête
Code sql :
1
2
3
4
5
 
      SELECT Commande.Id_client, COUNT(*) AS Nb
        FROM Client
          INNER JOIN Commande ON Client.Id_client = Commande.Id_client
      GROUP BY Commande.Id_client
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 15h47   #5
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
bonjour,

Le distinct est de trop (il fausse votre résultat).

Votre jointure est inutile, vu que vous avez les ID des clients dans votre table commande et, je suppose, que c'est une FK.

Ensuite apprenez à utilisez les jointure avec des inner join, left outer join, etc votre code n'en sera que plus compréhensible

donc si vous réécrivez votre requête de base :
Code :
1
2
3
4
 
SELECT id_client, count(*) AS nbCom
FROM commande
GROUP BY id_client
Vous avez votre base.

Pour votre besoin (c'est pas joli) :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
SELECT 
sum(CASE nbCom WHEN 1 THEN 1 else 0 END) AS Com1,
sum(CASE nbCom WHEN 2 THEN 1 ELSE 0 END) AS Com2,
....
sum(CASE nbCom WHEN 9 THEN 1 ELSE 0 END) AS Com9,
sum(CASE WHEN (nbCom > 9) THEN 1 ELSE 0 END) AS Sup10Com
FROM (SELECT count(*) AS nbCom
          FROM commande
          GROUP BY id_client) TMP
GROUP BY nbCom
Devrai convenir


edit: j'avais oublié le group by dans la 2eme requête, et j'ai changé les alias pour qu'ils ne commencent pas par un chiffre..
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 07h46   #6
Membre expérimenté
 
Inscription : octobre 2002
Messages : 654
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 654
Points : 552
Points : 552
Bonjour,
Personnellement j'écrirai la requête ainsi
Code :
1
2
3
4
5
6
7
8
9
SELECT nbCom, count(*) AS nb_client
FROM
(
	SELECT id_client, count(*) AS nbCom
	FROM commande
	GROUP BY id_client
) AS T
GROUP BY nbCom
ORDER BY nbCom
Et comme résultat on a
NbCom,nb_client
1 3
2 5
3 8
6 2

et ainsi de suite, mais il peut y avoir des trous, dans mon exemple, il n'y a aucun client avec 4 commandes, donc 4 commande n'apparait pas dans le résultat.

Cordialement
Soazig
soazig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 10h01   #7
Invité de passage
 
Inscription : septembre 2005
Messages : 17
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 17
Points : 4
Points : 4
merci à tous cela fonctionne.
sakini est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h52.


 
 
 
 
Partenaires

Hébergement Web