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 :

COUNT avec des dates sur valeurs non dédoublonnées ?


Sujet :

Langage SQL

  1. #1
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 604
    Points
    4 604
    Par défaut COUNT avec des dates sur valeurs non dédoublonnées ?
    Bonsoir

    J'ai voulu testé cette requête sur MySQL pour compter le nombre de commande par jour depuis un date données. Attention ici je compte sur le numéro de la commande qui se répète plusieurs fois car il y a plusieurs articles par commande :

    Ne me demandé pas pourquoi je prend le numéro de commande , c'est une table faite ainsi pour des vérifications ^^
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT "ma_date" , COUNT ("num_commande")
    FROM "ma_table"
    WHERE "ma_date">= AAAAMMJJ
    GROUP BY "ma_date"
    HAVING COUNT ("num_commande")
    ORDER BY "ma_date" ;
    Le COUNT ("num_commande") doit renvoyer en somme le nombre d'articles et non le nombre de commandes . Donc pas besoin d'un COUNT DISTINCT ici .

    Problème ici le HAVING COUNT ("num_commande") n'est pas reconnue par le compilateur .

    Merci de m'aiguiller

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    La clause HAVING permet de poser des filtres après l'opération d'agrégat. Une espèce de WHERE tardif si vous préférez.
    Ce que vous avez écrit n'est pas une expression évaluable.

    Supprimez simplement votre clause HAVING.

  3. #3
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    tanaka59; tu as oublié de mettre la condition dans la clauseexemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
     
    HAVING COUNT ("num_commande")> 2
    ...

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 168
    Points : 7 421
    Points
    7 421
    Billets dans le blog
    1
    Par défaut
    S'il n'y a pas besoin de DISTINCT, au lieu de compter les valeurs d'une colonne, comptez le nombre de lignes : c'est bien plus rapide.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT ma_date , COUNT(*)
    FROM ma_table
    WHERE ma_date >= AAAAMMJJ
    GROUP BY ma_date
    ORDER BY ma_date;

    PS : Le "ORDER BY ma_date" est (d'un point de vue purement technique) redondant avec le "GROUP BY ma_date", qui, après vérification du comportement de votre SGBD, pourra être supprimé.
    En effet, le GROUP BY, d'après la norme SQL, n'a aucune incidence sur l'ordre des lignes retournées. En revanche, d'un point de vue technique, la plupart des SGBD vont au plus simple : le plus rapide pour dédoublonner des lignes, c'est avant tout de les trier, puis de ne retenir que les lignes dont la précédente n'a pas la même valeur. Il en résulte donc, dans la majorité des cas (mais ce n'est pas toujours le cas) un tri par la clause GROUP BY.

  5. #5
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    C'est quand même dommage de ne pas lire tous les intervenants

  6. #6
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 168
    Points : 7 421
    Points
    7 421
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Chtulus Voir le message
    Bonjour,

    C'est quand même dommage de ne pas lire tous les intervenants
    Euh... C'est à moi que s'adresse ce message ? (et surtout le -1 que j'aimerais bien voir justifié)

    Car ma réponse n'est en rien redondante avec ce qui a été dit, c'est un complément d'information.

    Et autant je suis tout à fait prêt à comprendre le -1 s'il porte sur mon conseil de virer le ORDER BY en présence d'un GROUP BY, mais à ce moment, il faut aller jusqu'au bout et dire pourquoi c'est mal, autant j'ai lu attentivement les réponses précédentes, et ma réponse n'est en rien redondante ou contradictoire avec ce qui a été dit plus haut.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Ce qui est surprend avec votre première réponse, c'est que ce que vous dites ici juste :
    le GROUP BY, d'après la norme SQL, n'a aucune incidence sur l'ordre des lignes retournées.
    Mais derrière vous ajoutez des bêtises :
    d'un point de vue technique, la plupart des SGBD vont au plus simple : le plus rapide pour dédoublonner des lignes...
    Oracle jusqu'en 9i utilisait bien un algorithme de tri pour dédoublonner, mais en 10g ils sont passés par un algo de hash, plus rapide.
    Tous ceux qui ont développé avec la mentalité "si j'ai un group by mon order by est inutile" se sont retrouvés dans le mal.

    Restez donc sur votre première phrase citée ici qui m'allait bien, et utilisons les deux clauses indépendamment en fonction du besoin.

    Par ailleurs, ce que vous dites ici est faux également (le dimanche c'est fait pour se reposer, surtout pour les jeunes papas) :
    S'il n'y a pas besoin de DISTINCT, au lieu de compter les valeurs d'une colonne, comptez le nombre de lignes : c'est bien plus rapide
    Ce n'est pas une question de DISTINCT, c'est une question de NULL / NOT NULL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    with sr (c1, c2) as
    (
    select 1, 1    union all
    select 1, null
    )
    select count(*)  as nb_rows
         , count(c1) as nb_c1_nn
         , count(c2) as nb_c2_nn
      from sr;
     
       NB_ROWS   NB_C1_NN   NB_C2_NN
    ---------- ---------- ----------
             2          2          1

  8. #8
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 168
    Points : 7 421
    Points
    7 421
    Billets dans le blog
    1
    Par défaut
    Ok pour le coup du GROUP BY / ORDER BY (j'avais bien dit de toute façon de vérifier avant le comportement du SGBD).

    Mais pour le NULL dans le COUNT, autant je suis d'accord sur le fond, mais autant dans notre cas, à moins qu'il n'y ait un autre sujet dédié au problème, j'ai jamais entendu parler du NULL dans la table. Et compter des articles en comptant les valeurs "numéro de commande non nulles", c'est pas vraiment logique de se dire qu'il faut écarter les lignes à NULL... puisqu'on n'écarte que les lignes non rattachées à des commandes, mais pas celles qui ne contiennent pas d'article !
    A ce moment, si NULL il doit y avoir, c'est un COUNT() sur la colonne article (voir sur la concaténation "numéro de commande + article" pour virer les lignes qui sont rattachée à aucune commande ainsi que celles rattachées à aucun article).

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Cela dit en relisant la première ligne de l'auteur, je me demande s'il ne souhaite pas faire un count(distinct num_commande) au final.
    Ce n'est pas très clair, on verra s'il réagit.

  10. #10
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 604
    Points
    4 604
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Cela dit en relisant la première ligne de l'auteur, je me demande s'il ne souhaite pas faire un count(distinct num_commande) au final.
    Ce n'est pas très clair, on verra s'il réagit.
    Bonjour,

    Tout d'abord merci de vos retours

    Effectivement il s'agit bien de compter le nombre "distinct" de numéro de commande.

  11. #11
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 168
    Points : 7 421
    Points
    7 421
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tanaka59 Voir le message
    Donc pas besoin d'un COUNT DISTINCT ici.
    Ouais, alors là faudra m'expliquer hein...

  12. #12
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 604
    Points
    4 604
    Par défaut
    On m a toujour dit que le count distinct n est pas possible directement dans le select. Il faudrait soit disant une sous requete pour faire le comptage. Je suis un peu perplexe sur la chose

  13. #13
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 168
    Points : 7 421
    Points
    7 421
    Billets dans le blog
    1
    Par défaut
    Le COUNT s'utilise de trois manières :
    - COUNT(*) => Compte TOUTES les lignes, y compris les doublons. Dans ce cas, pour des raisons de performances, on met toujours *, JAMAIS de nom de colonne, d'autant que le comportement n'est pas le même
    - COUNT(DISTINCT col) => Compte le nombre de valeurs distinctes d'une colonne donnée. Les valeurs NULL sont ignorées
    - COUNT(ALL col) ou COUNT(col) => Compte toutes les lignes où la colonne est non vide, doublons compris

    COUNT (tout comme les autres fonctions d'agrégat) porte toujours sur le jeu de résultat de la requête, jamais directement sur les données des tables.

  14. #14
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 604
    Points
    4 604
    Par défaut
    Bonsoir

    Merci de vos retours.

    Je suis en train de procéder à des tests avec le count pour prendre la main sur la commande.

  15. #15
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 604
    Points
    4 604
    Par défaut
    Bonsoir ,

    Voici un exemple de requête testée qui a marché

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE matabledesortie as 
     
    SELECT COUNT (DISTINCT(codemachintruc)) , datemachinchose
    FROM matablededepart
    WHERE datemachinchose BETWEEN date1 AND date2
    GROUP BY datemachinchose
    ORDER BY datemachinchose ;

    Merci des tuyaux

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 08/07/2014, 17h41
  2. [11gR2] Index cassé avec des heures sur des dates
    Par Golgotha dans le forum Oracle
    Réponses: 3
    Dernier message: 12/12/2013, 14h54
  3. Probleme sur order by avec des dates.
    Par Shandler dans le forum MySQL
    Réponses: 8
    Dernier message: 09/02/2009, 14h39
  4. Decode avec des dates pour calculer une valeur
    Par decisio dans le forum Langage SQL
    Réponses: 1
    Dernier message: 19/01/2009, 12h50

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