Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
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 14/12/2011, 10h09   #1
Invité régulier
 
Inscription : janvier 2011
Messages : 54
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 54
Points : 6
Points : 6
Par défaut Requête moyenne visiteurs

Bonjour,

J'aurais besoin de votre aide pour la création d'une requête spécifique, j'aimerais que celle-ci me renvoie la moyenne de visiteurs inscrits par jour (en sélectionnant une période déterminée (ex: décembre)

Ma table 'visitors' contient entre autre les champs: id, date_in.

Mon idée est de ne choisir que les jours où il y a eu au moins une visite (pour éviter les we et jours fériés).

Merci pour votre aide.
fra7878 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 10h14   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
bonjour,

toutes les réponses sont ici : http://sqlpro.developpez.com/cours/sqlaz/ensembles/

Revenez avec votre requête + le problème rencontré, s'il y a

Par contre j'ai un doute sur la demande : "une moyenne par jour de visiteur", ne serai-ce pas plutôt le nombre de visiteurs par jour ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 10h30   #3
Invité régulier
 
Inscription : janvier 2011
Messages : 54
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 54
Points : 6
Points : 6
Merci mais on ne parle pas de moyenne dans le sujet posté.

Mon idée est d'utiliser la fonction AVG qui me permettrait de faire une moyenne de visiteurs/jour "ouvrable" sur une période déterminée.

Ex: Décembre 2011:
01/12: 6 visites, 02/12: 13 visites, 05/12: 9 visites, etc.

J'aimerais qu'il me renvoie dans ce cas: 9,33
A ne pas perdre de vue qu'il ne faut pas prendre en compte le 3 et 4 décembre (je me baserais sur les jours où il y a eu au moins une visite).

Merci pour votre aide
fra7878 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 10h53   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
bonjour,

oui l'idée est là.

Donc où bloquez vous avec votre requête ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 11h45   #5
Invité régulier
 
Inscription : janvier 2011
Messages : 54
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 54
Points : 6
Points : 6
Là, je suis toujours à un total de visites sur une période donnée:

Code :
1
2
3
4
5
 
SELECT COUNT( DISTINCT date_in ) 
FROM visitors
WHERE date_in
BETWEEN '2011-12-01' AND '2012-01-01'
Mais il faudrait:
1° Calculer le nombre de jours 'ouvrables' sur le mois (au moins une visite/jour)
2° Compter le nombre de visites total pour ma période (ok, voir ci-dessus)
3° Diviser le nombre de visites par le nombre de jours 'ouvrables'

Merci
fra7878 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 11h54   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
Dans le lien qui vous a été donné, il y a aussi GROUP BY qui vous permettra d'avoir le nombre par jour où il y a eu des connexions.

Si vous ne souhaitez que les jours ouvrés, vous pouvez faire une restriction en extrayant de la date le jour de la semaine et en ne demandant que ce jour soit différent du samedi et du dimanche. Voir la doc pour plus d'explication.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 11h55   #7
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
et bien, suivant le lien que je vous avais donné :

Le nombre de personne par jours qui visite :

Code :
1
2
3
4
5
 
SELECT date_in, count(*) AS cnt
FROM visitors
WHERE date_in BETWEEN '2011-12-01' AND '2011-12-31' 
GROUP BY date_in
(au passage un between c'est un test de type >= et <=)


Et pour la moyenne du mois qui en découle :
Code :
1
2
3
4
5
6
7
 
SELECT avg(cnt)
FROM (
 SELECT date_in, count(*) AS cnt
 FROM visitors
 WHERE date_in BETWEEN '2011-12-01' AND '2011-12-31' 
 GROUP BY date_in) b
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 13h23   #8
Invité régulier
 
Inscription : janvier 2011
Messages : 54
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 54
Points : 6
Points : 6
La 1e requête me donne un tableau de 2 colonnes (la date en format long et une colonne où je n'ai que la valeur 1)
Et la 2e requête me donne la moyenne de la conne cnt, autrement dit 1.

A ce stade, pour résoudre mon problème il faudrait que je calcule le nombre de jours qui ont enregistré au moins une visite.

Le hic, c'est qu'il faut faire le compte pour des valeurs date:
2011-12-14 11:05 et 2011-12-14 13:10 ne font qu'un jour.

Etant donné que je n'ai jamais utilisé la fonction GROUP BY, je suis un peu perdu...

Merci
fra7878 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 13h35   #9
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Pour le problème de date il faudra utiliser les fonctions de formatage de date :
http://dev.mysql.com/doc/refman/5.5/...functions.html

A intégrer dans la 1ere requete et le group by associé.
Vous avez toute la doc necessaire dans ce poste, je vous laisse chercher.


Ensuite :
Citation:
A ce stade, pour résoudre mon problème il faudrait que je calcule le nombre de jours qui ont enregistré au moins une visite.
Ceci, n'est-ce pas implicitement ce que fait déjà la sous-requête ?

Vu votre présentation du sujet, le problème sera résolu une fois que vous aurez géré le formatage de votre timestamp en date dans la sous-requête.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 14h01   #10
Invité régulier
 
Inscription : janvier 2011
Messages : 54
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 54
Points : 6
Points : 6
J'y suis presque pour ma requête pour compter le nombre de jours visités sur le mois:

Code :
1
2
3
4
 
SELECT DISTINCT DAYOFMONTH( date_in ) 
FROM visitors
WHERE date_in BETWEEN '2011-12-01' AND '2012-12-31'
J'obtiens: 1, 2, 5, 12, 13 (parfait)

Avec cette requête, j'obtiens le détail des jours visités, il reste à incorporer mon count pour obtenir la valeur 5.

Une idée pour incorporer le count dans la requête ci-dessus?

Merci
fra7878 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 14h05   #11
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
L'idée serai que vous reprenniez le poste #7 de ce topic et que vous compreniez ce que je vous ai proposé

Concernant le reformatage de vos date il y a aussi cette solution :

Code :
1
2
3
4
 
SELECT DISTINCT date(date_in)
FROM visitors
WHERE date_in BETWEEN '2011-12-01' AND '2012-12-31'
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 14h20   #12
Invité régulier
 
Inscription : janvier 2011
Messages : 54
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 54
Points : 6
Points : 6
En effet

J'ai trouvé la requête qui me permet de calculer le nombre de jours visités sur une période:

Code :
1
2
3
4
5
6
 
SELECT COUNT( DISTINCT DAYOFMONTH( date_in ) ) 
FROM visitors
WHERE date_in
BETWEEN '2011-12-01'
AND '2012-12-31'
Maintenant que j'ai mes deux requêtes, serait-il possible de n'en faire plus qu'une? càd diviser la valeur que j'obtiens dans celle-ci par la valeur que j'obtiens plus haut (nbre vistes/nbre de jours visités):

Code :
1
2
3
4
5
6
 
SELECT COUNT( * ) 
FROM visitors
WHERE date_in
BETWEEN '2011-12-01'
AND '2011-12-31'
Merci
fra7878 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 14h25   #13
Invité régulier
 
Inscription : janvier 2011
Messages : 54
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 54
Points : 6
Points : 6
Voilà, j'ai trouvé, le résultat me paraît correct:

Code :
1
2
3
4
5
6
 
SELECT (COUNT( * ) / COUNT( DISTINCT DAYOFMONTH( date_in ) ) )
FROM visitors
WHERE date_in
BETWEEN '2011-12-01'
AND '2012-12-31'
Est-ce que cela vous semble correct?

Encore merci pour vos idées.
fra7878 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 14h36   #14
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
Dans votre besoin, vous parliez des jours ouvrés. Je ne retrouve pas cette notion dans votre requête qui va prendre toutes les dates de la table.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 15h23   #15
Invité régulier
 
Inscription : janvier 2011
Messages : 54
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 54
Points : 6
Points : 6
C'est vrai et la requête suivante affiche le nombre de jours où il y a eu au moins une visite (j'en déduis le nombre de jours ouvrables) vu que dans mon cas, il est potentiellement impossible qu'aucune visite ne soit effectuée un jour ouvrable):

Code :
1
2
3
4
5
6
 
SELECT COUNT( DISTINCT DAYOFMONTH( date_in ) ) 
FROM visitors
WHERE date_in
BETWEEN '2011-12-01'
AND '2012-12-31'
fra7878 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 04h45.


 
 
 
 
Partenaires

Hébergement Web