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

Langage SQL Discussion :

Retourner un count d'element par mois


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    Points : 17
    Points
    17
    Par défaut Retourner un count d'element par mois
    Bonjour,

    Je travail sur une requete qui me permet de comptabiliser le nombre d'accès à une donnée par mois sur 12 mois glissant.

    Dans ma table j'ai donc id, type_donnee, date.

    Je souhaite donc obtenir un réultat du type :

    mois :: nb
    4 :: 1200
    5 :: 567
    6 :: 234
    7 :: 1001
    8 :: 2345
    9 :: 0
    10 :: 256
    11 :: 102
    12 :: 562
    1 :: 0
    2 :: 120
    3 :: 769

    j'essai donc la requete suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT MONTH( FROM_UNIXTIME( date ) ) AS mois, (
     
    CASE WHEN COUNT( id ) & gt;
     
    0 THEN COUNT( id ) ELSE 0 END
    ) AS nb FROM  `ma_table` WHERE DATE>1175378401 AND type_donnee='connexion' GROUP BY mois ORDER BY DATE
    Mais j'obtient le résultat :
    mois :: nb
    4 :: 203
    5 :: 793
    12 :: 1235
    3 :: 3764

    je n'ai pas de count pour les mois qui n'ont pas d'enregistrement.

    Merci pour votre aide

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Faites une table des mois (si vous n'en avez pas déjà une) et effectuez une jointure externe à partir de celle ci vers la table que vous utilisez actuellement. Les mois manquant apparaîtront alors.

    Au passage, enlevez le CASE pour votre comptage, c'est inutile.

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 115
    Points : 28 493
    Points
    28 493
    Par défaut
    Comment veux-tu faire pour retourner une valeur qui n'est pas dans la sélection ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    beh justement je pose la question

    Bon étant donné que je fais un select sur les mois je me disait que peut être il avait une subtilité qui permettrai d'afficher chaque mois depuis la date minimum jusqu'à maintenant et de faire un count de l'élément type_donnee pour ce mois et zéro s'il n'y a pas d'enregistrement.

    Mais bon visiblement ce n'est pas possible.

    Je conçois que ma requête n'amène pas à ce résultat, mais j'ai plus de mal a comprendre en quoi c'est impossible vu que toutes les données sont la.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    SQL ne saurait inventer des données qui n'existe pas. SQL n'est pas magique, mais logique. SI vous voulez voir apparaître un mois (et son année associée, car un mois sans année c'est illogique), alors il vous faut avoir cette information d'une manière ou d'une autre dans la base.

    La manière la plus performante de faire cela est d'avoir une table avec toutes les dates depuis l'origine des dates de votre SI jusqu'a 20 ou 30 ans de prospective.

    Lisez l'article que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/gestiontemps/

    Après il suffira de faire une jointure externe droite sur cette table et d'utiliser la colonne mois de la table calendrier.

    A +

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Merci pour vos réponses je vais donc m'orienter vers cette solution.

    Je crois savoir que vous avez sorti un livre et au vu des réponses toujours pertinentes que vous fournissez je penses que je vais l'acheter.

    Pourriez vous m'indiquer les références ou un lien pour me le procurer.Merci.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Bon alors j'ai testé la méthode de la table des mois, j'ai donc créé une table mois qui contient id, libelle avec comme clé primaire le numéro du mois.
    J'ai fais une jointure comme expliqué dans le cours de sqlpro donc ma requete donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT COUNT( id_log ) AS NOMBRE, mois.id
    FROM ma_table
    LEFT JOIN mois ON mois.id = MONTH( FROM_UNIXTIME( DATE ) ) 
    WHERE DATE >
    1175378401 AND type_donnee='connexion' GROUP BY mois.id ORDER BY DATE
    Donc petite explication la date que je fournis est un timestamp unix.
    Dans ma table j'ai aussi les déconnexion donc je dois spécifier le type_donnee.

    Mais j'ai toujours le même résultat. Il compte le nombre de résultats et me retourne un mois uniquement si il y a une connexion ce mois-ci.

    Faut-il absolument que les champs du ON soit identique ou est-ce que la comparaison des valeurs qu'ils contiennent suffit ?

    Quelqu'un voit-il une autre solution ?

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Votre jointure est exprimée "dans le mauvais sens". Regardez le cours sur les jointures de SQLPro et demandez un coup si vous n'arrivez pas à la corriger par vous même après ça.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Alors j'ai lu le cours sur les jointures j'ai testé une première requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT id, libelle, COUNT( ma_table.id_log ) AS NOMBRE
    FROM mois
    RIGHT OUTER JOIN ma_table ON id = MONTH( FROM_UNIXTIME( ma_table.date ) ) 
    WHERE ma_table.date>1175378401 AND ma_table.type_donnee =  'connexion' GROUP BY id ORDER BY ma_table.date
    Donc ici je sélectionne les mois de ma table mois donc je devrais avoir 12 lignes en résultat et je joins le count des enregistrements de ma_table qui sont regroupés par mois et qui correspondent au type_donnee 'connexion'.

    ce qui m'a donné le même résultat.
    J'ai pourtant fait un RIGHT OUTER JOIN pour avoir tous les éléments de la première table même si la clause de jointure n'est pas vérifiée !!

    J'ai donc modifier ma requête pour joindre une table qui contenait déjà mes résultats à la table des mois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT id, libelle, tab_res.NOMBRE
    FROM mois
    RIGHT OUTER JOIN (
     
    SELECT date, COUNT( ma_table.id_log ) AS NOMBRE, MONTH( FROM_UNIXTIME( ma_table.date ) ) AS mois_log
    FROM ma_table
    WHERE ma_table.date>
    1175378401 AND ma_table.type_donnee =  'connexion' GROUP BY MONTH( FROM_UNIXTIME( ma_table.date ) ) ORDER BY date
    ) AS tab_res ON id = tab_res.mois_log GROUP BY id ORDER BY tab_res.date
    Et j'ai toujours la même chose c'est à dire juste les mois qui contiennent des enregistrements.

    Je ne comprends donc plus d'où peut provenir l'erreur. Je test mes requêtes avec phpmyadmin donc sous MySQL, y'a-t-il un problème d'interprétation avec ce moteur ?

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Attention !

    A LEFT JOIN B
    =
    B RIGHT JOIN A


  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Ok effectivement j'ai fait n'importe quoi
    Merci je ne cherchais pas du tout la.

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

Discussions similaires

  1. [MySQL] group by, inclure les mois retournant 0 count()
    Par nath-0-0 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 29/05/2013, 17h03
  2. [MySQL] probleme tableau somme count(*) d'une table par mois
    Par italiano1360 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 22/05/2012, 14h47
  3. Grouper des count(Date) par mois?
    Par Hydex dans le forum Langage SQL
    Réponses: 1
    Dernier message: 28/06/2007, 16h51
  4. retourner un count() par une fonction PL/pgSQL ?
    Par ctobini dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 22/05/2007, 15h12
  5. Regroupement par mois
    Par fplanglois dans le forum SQL
    Réponses: 7
    Dernier message: 29/07/2003, 17h32

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