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 et SQL. Discussion :

faire plusieur count dans une même requète


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 67
    Points : 49
    Points
    49
    Par défaut faire plusieur count dans une même requète
    Salut,

    voilà je voudrais avoir une requète qui me donne le nombre de facture qu'il y a eu pour chaque mois de l'année.


    table : facture
    champs : facture_date


    je pensais faire une requete du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select count(facture1.facture_date) as JANVIER, count(facture2.facture_date) as FEVRIER ...
    from facture as facture1, facture as facture2 ...
    where facture1.facture_date like "*/01/2007"
    and facture2.facture_date like "*/02/2007"
    ...
    ou avec un Having a la place de where mais cela ne marche pas. Je ne sais pas si cela est possible et que c'est donc mon écritue qui n'est pas bonne, ou si cela n'est pas possible.

    sachant que l'année serra prise dans un champs dans un frm par la suite.



    pour le moment j'ai un formulaire avec une zone de liste pour chaque mois et dont la requete (pour la liste de valeur) correpond à la recherche du mois voulu. Ca marche mais c'est pas propre ^^

    Merci bien

  2. #2
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    essaie une requête dans ce genre
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT  Sum(IIF(Month([facture_date])=1,1,0)) As Janvier,
    	Sum(IIF(Month([facture_date])=2,1,0)) As Février,
    	Sum(IIF(Month([facture_date])=3,1,0)) As Mars,
    	Sum(IIF(Month([facture_date])=4,1,0)) As Avril,
    	Sum(IIF(Month([facture_date])=5,1,0)) As Mai,
    	Sum(IIF(Month([facture_date])=6,1,0)) As Juin,
    	Sum(IIF(Month([facture_date])=7,1,0)) As Juillet,
    	Sum(IIF(Month([facture_date])=8,1,0)) As Août,
    	Sum(IIF(Month([facture_date])=9,1,0)) As Septembre,
    	Sum(IIF(Month([facture_date])=10,1,0)) As Octobre,
    	Sum(IIF(Month([facture_date])=11,1,0)) As Novembre,
    	Sum(IIF(Month([facture_date])=12,1,0)) As Decemenbre
    FROM facture
    WHERE (((Year([facture_date]))=2007));
    A+

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 67
    Points : 49
    Points
    49
    Par défaut
    cela marche nikel merci bien.


    Juste pour savoir, des requetes qui marche avec count, sont est plus rapide avec ce genre de méthode ? (SUM(IIF ...)

  4. #4
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Oui en théorie un Count seul est plus rapide que Sum(IIF(...))
    Mais normalement ta requête devrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Month([facture_date]) As [Mois], Count(*) As [Nombre]
    FROM facture
    WHERE (((Year([facture_date]))=2007))
    GROUP BY Month([facture_date]);
    C'est la bonne manière d'exploiter les fonctionnalités de regroupement et les fontions d'agrégation.

    Mais comme tu veux tes données en colonnes on sort du cadre normal.
    Ma requête perd du temps à cause des expressions (IIF, Month, Year) mais elle en gagne en ayant qu'une seule table dans FROM.
    La tienne avait 12 tables sans jointure dans le FROM. Et en plus j'ai un doute sur les perfomances d'un critère comme celui-ci sur un champ date
    A la limite tu aurais pu l'écrire avec 12 sous-requêtes, exemple:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT TOP 1
      (SELECT Count(*) FROM facture WHERE [facture_date] between dateserial(2007,1,1) and dateserial(2007,1,31)) AS Janvier,
      (SELECT Count(*) FROM facture WHERE [facture_date] between dateserial(2007,2,1) and dateserial(2007,3,1)-1) AS Fevrier, 
       .......
      (SELECT Count(*) FROM facture WHERE [facture_date] between dateserial(2007,12,1) and dateserial(2007,12,31)) AS Decembre
    FROM facture
    Compare les deux et fais nous part de tes impressions.

    A+

  5. #5
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Peut-être plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Sum(1) AS Expr2  FROM Facture GROUP BY Format([Facture_date],"mm");

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 67
    Points : 49
    Points
    49
    Par défaut
    @ LedZeppII


    ta 1ere version Sum(IIF est sur ma base pratiquement aussi rapide qu'un count classique (resultat en ligne ^^) mais surtout elle a l'avantage de donner tous les mois même si y en a un à 0 ce qu'un count ne fait pas.


    Ta 2eme version et beaucoup plus longue par contre probablement a cause des BETWEEN. Mais bon perso j'utilise à d'autre endroit le '*/*/annee' et j'ai pas de pb ^^ si je fait qu'un count (ou une liste)

    Mais la version avec 12 tables ne marche pas, enfin au bout de 15min j'ai toujours pas de résultat et Access prend 100% du processeur alors je le kill




    @ClaudeLELOUP

    effectivement cela marche bien aussi, mais une fois modifier pour avoir le même résultat visuel des résultats elle est aussi longue que celle de LedZeppII


    Merci bien à vous 2 en tout cas

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

Discussions similaires

  1. Faire plusieurs count dans une seule requete
    Par Gregory.M dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/07/2010, 12h35
  2. Plusieurs count() dans une même requête
    Par DarkaMaul dans le forum Requêtes
    Réponses: 4
    Dernier message: 23/11/2009, 17h20
  3. Réponses: 9
    Dernier message: 19/04/2009, 15h45
  4. Réponses: 1
    Dernier message: 28/03/2007, 12h23
  5. [Requête] plusieurs champs dans une même table ayants la même source
    Par Christophe93250 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 25/04/2006, 16h18

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