|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |
|
Invité régulier
![]() Inscription : mars 2009 Messages : 25 ![]() |
Bonjour, ma requête sql est la suivante :
SELECT nb_cmd, count(*) as nb_clients FROM ( SELECT ID_CLIENT, count(*) as nb_cmd FROM TableCmd (NOLOCK) WHERE DATE is null GROUP BY ID_CLIENT ) t GROUP BY nb_cmd; Le résultat me donne le nombre de clients correspondant à un nombre de commandes : Citation:
Ce que j'essaye de faire c'est de regrouper ces données en intervalle, car le résultat est vraiment trop grand. Ceci est dans le but de représenter à l'aide d'un graphe la répartition du nbr de client par commande. Je n'arrive pas à formuler ce problème! Merci d'avance pour toute aide proposée ! |
|
|
|
00
|
|
|
#2 | ||||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Bonjour,
Vous pouvez faire comme suit si vous êtes sous SQL Server 2005 ou + : Code :
Code :
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||||
|
10
|
|
|
#3 |
|
Invité régulier
![]() Inscription : mars 2009 Messages : 25 ![]() |
Re,
Merci beaucoup pour votre aide elsuket! J'ai exécute votre code et ça à l'air de vraiment marcher ! J'essaye de comprendre la façon avec laquelle vous avez construit votre solution, en tous les cas merci beaucoup ! |
|
|
00
|
|
|
#4 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour
Si votre intervalle est linéaire (tranche de 10 dans mon exemple) et à partir de 2005, vous pouvez aussi faire comme ceci : Code SQL :
Par contre, si une tranche n'est aucun client, elle n'apparaitra pas dans le resultat... |
||
|
|
00
|
|
|
#5 |
|
Invité régulier
![]() Inscription : mars 2009 Messages : 25 ![]() |
Merci aieeeuuuuu pour votre réponse, j'ai essayé d'adapter votre code avec mes données mais je n'ai pas réussi. Etant donné que la première solution marche , je garde la première proposition.
Par contre je n'ai pas très bien compris votre logique, je vais essayer d'y penser prochainement. En tout cas merci ! |
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
ce n'est pas bien compliqué :
COUNT() renvoi un entier. Si vous le divisez, vous gardez un entier, et donc uniquement la partie entière du résultat de la division. Ainsi (et toujours dans un contexte de INT ): si @x est valué à 18 : @x /10 = 1 si @x vaut 13 : @x /10 = 1 donc en partitionnant sur COUNT(*) /10, on regroupe par tranche de 10... Vous pouvez aussi utiliser la fonction ROUND() pour arrondir explicitement et rendre la requête peut être plus compréhensible |
|
|
00
|
|
|
#7 | |
|
Invité régulier
![]() Inscription : mars 2009 Messages : 25 ![]() |
Citation:
D'accord, donc si je comprend bien les bornes de l'intervalle à construire sont définies à partir du nombre d'enregistrement contenus dans ma table. J'y vois plus clair en tout cas ! Je vais l'essayer , Merci |
|
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
non,
C'est le dénominateur de la division du COUNT qui défini la tranche. Vous pouvez faire PARTITION BY COUNT(*) / 100 et regrouper par tranche de 100 par contre en effet, si une tranche ne contient aucun élément, elle ne sera pas dans le resultat. Dans votre cas, si aucun client n'a passé entre 10 et 19 commandes, vous aurez la tranche 0-9, la tranche 20-29, mais pas la tranche 10-19. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com