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 averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    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 Expert

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    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 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    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 140
    Par défaut
    Comment veux-tu faire pour retourner une valeur qui n'est pas dans la sélection ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    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
    22 036
    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 : 22 036
    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 +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    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 averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    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 Expert

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    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 averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    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 Expert

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

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

    A LEFT JOIN B
    =
    B RIGHT JOIN A


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

    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    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