IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Requête moyenne visiteurs


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 98
    Points : 40
    Points
    40
    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.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    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 ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 98
    Points : 40
    Points
    40
    Par défaut
    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

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    oui l'idée est là.

    Donc où bloquez vous avec votre requête ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 98
    Points : 40
    Points
    40
    Par défaut
    Là, je suis toujours à un total de visites sur une période donnée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    et bien, suivant le lien que je vous avais donné :

    Le nombre de personne par jours qui visite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 98
    Points : 40
    Points
    40
    Par défaut
    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

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    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 :
    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.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 98
    Points : 40
    Points
    40
    Par défaut
    J'y suis presque pour ma requête pour compter le nombre de jours visités sur le mois:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  11. #11
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select distinct date(date_in)
    from visitors
    WHERE date_in BETWEEN '2011-12-01' AND '2012-12-31'

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 98
    Points : 40
    Points
    40
    Par défaut
    En effet

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT COUNT( * ) 
    FROM visitors
    WHERE date_in
    BETWEEN '2011-12-01'
    AND '2011-12-31'
    Merci

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 98
    Points : 40
    Points
    40
    Par défaut
    Voilà, j'ai trouvé, le résultat me paraît correct:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  14. #14
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 98
    Points : 40
    Points
    40
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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'

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide pour requête : moyenne d'une somme
    Par xpair dans le forum Langage SQL
    Réponses: 4
    Dernier message: 30/03/2015, 16h11
  2. [AC-2007] Requête: moyenne de champs
    Par EgSDF dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 08/10/2013, 15h31
  3. Fonction 'type moyenne' dans requêtes
    Par Devipir dans le forum Access
    Réponses: 8
    Dernier message: 19/06/2006, 21h21
  4. [Requête]Problème de moyenne
    Par Angath dans le forum Langage SQL
    Réponses: 7
    Dernier message: 05/10/2005, 23h58
  5. Réponses: 3
    Dernier message: 18/05/2003, 00h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo