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

SQL Oracle Discussion :

Problème sur un count avec group by sur plusieurs colonnes


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 171
    Points : 70
    Points
    70
    Par défaut Problème sur un count avec group by sur plusieurs colonnes
    Bonjour,

    J'ai un problème sur un select comportant un count(*).

    Voici ma table (elle permet de stocker plusieurs ligne de texte pour un élément identifié par n°1, n°2, n°3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ----------------------------------------------------------------------------------
    | n° 1  |    n° 2 |   n° 3  |  numéro séq. | catégorie | texte                   |
    --------|---------|---------|--------------|--------------------------------------
    | 10    |    0    |   0     |  1           | A         | ligne 1 de ni1-A        |
    | 10    |    0    |   0     |  2           | A         | ligne 2 de ni1-A        |
    | 10    |    0    |   0     |  3           | A         | ligne 3 de ni1-A        |
    | 10    |    0    |   0     |  1           | B         | ligne 1 de ni1-B        |
    | 10    |    0    |   0     |  2           | B         | ligne 2 de ni1-B        |
    | 10    |    0    |   0     |  3           |           | ligne 3 de ni1-A        |
    | 10    |    25   |   0     |  1           | A         | ligne 1 de ni1, ni2 -A  |
    | 10    |    25   |   0     |  2           | A         | ligne 2 de ni1, ni2 -A  |
    | 10    |    25   |   0     |  1           | B         | ligne 1 de ni1, ni2 -B  |
    | 10    |    25   |   0     |  2           | B         | ligne 2 de ni1, ni2 -B  |
    ----------------------------------------------------------------------------------
    Pour n°1=10, n°2=0, n°3=0, je voudrais que le count me ramène 3 pour me dire que j'ai des enregistrements pour 3 catégories.
    Je n'ai pas besoin de l'information m'indiquant que j'ai 3 lignes pour A et 2 lignes pour B et 1 sans catégorie.

    Idem pour n°1=10, n°2=25, n°3=0, le count devrait me ramener 2 puisque j'ai des enregistrements pour A et pour B.

    Seulement comment faire ce count?

    Je pensais faire un group by sur n°1, n°2, n°3 mais ça me ramène le nombre total de lignes pour chaque n1, n2, n3.
    en rajoutant la catégorie dans le group by, j'ai le nombre d'enregistrements pour chaque catégorie...

    Bref, je ne m'en sors pas... Si quelqu'un voit comment faire, j'attends vos conseils!

    Merci

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    La syntaxe de COUNT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select num1, num2, num3, count(distinct categorie)
      from la_table
     group by num1, num2, num3

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 171
    Points : 70
    Points
    70
    Par défaut
    Merci!

    Par contre, le distinct est de trop, non?
    Lorsque je fais un count(distinct categorie) pour num1=10, num2=0, num3=0, j'obtiens 2, alors que count(categorie) = 3.
    Et j'ai bien des enregistrements pour categ=A, categ = B et categ = null, donc le count(categorie) me parait plus adapté.

    Faut que je revois toutes ces histoires de groupement, à force de faire des requêtes plutot simples, j'ai perdu la main...

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    C'est à cause de la valeur NULL, le count(colonne) ne compte pas les NULLs (tiré de la doc proposé ci dessus) :
    If you specify expr, then COUNT returns the number of rows where expr is not null. You can count either all rows, or only distinct values of expr.
    Tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count(distinct coalesce(colonne,'XXX'))
    Où XXX est une valeur improbable pour une catégorie.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 171
    Points : 70
    Points
    70
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    C'est à cause de la valeur NULL, le count(colonne) ne compte pas les NULLs (tiré de la doc proposé ci dessus) :
    J'ai bien compris mais à quoi sert le distinct finalement?...

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Ben DISTINCT permet de compter 1 seule fois A, 1 seule fois B et, avec le COALESCE, 1 seule fois la valeur NULL, donc le résultat sera 3 pour 10,0,0.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 171
    Points : 70
    Points
    70
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Ben DISTINCT permet de compter 1 seule fois A, 1 seule fois B et, avec le COALESCE, 1 seule fois la valeur NULL, donc le résultat sera 3 pour 10,0,0.
    Oui mais sans le distinct, j'ai déjà 3 donc quelle est la différence au niveau base?

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Je ne vois pas bien où tu as 3 sans DISTINCT + COALESCE (avec l'exemple fourni) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    SQL> with t (n1,n2,n3,numseq,categorie) as (
      2  select 10,0,0,1,'A' from dual union all
      3  select 10,0,0,2,'A' from dual union all
      4  select 10,0,0,3,'A' from dual union all
      5  select 10,0,0,1,'B' from dual union all
      6  select 10,0,0,2,'B' from dual union all
      7  select 10,0,0,3,''  from dual union all
      8  select 10,25,0,1,'A' from dual union all
      9  select 10,25,0,2,'A' from dual union all
     10  select 10,25,0,1,'B' from dual union all
     11  select 10,25,0,2,'B' from dual
     12  )
     13  select n1,n2,n3,
     14         count(*), count(categorie), count(distinct categorie), count(distinct coalesce(categorie,'XXX'))
     15    from t
     16   group by n1,n2,n3
     17  /
     
            N1         N2         N3   COUNT(*) COUNT(CATEGORIE) COUNT(DISTINCTCATEGORIE) COUNT(DISTINCTCOALESCE(CATEGORIE,'XXX'))
    ---------- ---------- ---------- ---------- ---------------- ------------------------ ----------------------------------------
            10          0          0          6                5                        2                                3
            10         25          0          4                4                        2                                2
     
    SQL>

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 171
    Points : 70
    Points
    70
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Je ne vois pas bien où tu as 3 sans DISTINCT + COALESCE (avec l'exemple fourni) :
    Je parlais pas avec le coalesce, mais seulement avec le count(distinct categorie).

Discussions similaires

  1. GROUP BY sur x tables avec UNION
    Par fred23195 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/04/2008, 18h08
  2. Group by sur Produit mais avec date qui se suivent
    Par suantay dans le forum Langage SQL
    Réponses: 9
    Dernier message: 29/02/2008, 12h13
  3. Réponses: 1
    Dernier message: 18/07/2007, 17h18
  4. Requête avec Group by sur Oracle 8i
    Par madina dans le forum Oracle
    Réponses: 14
    Dernier message: 16/06/2006, 12h41
  5. PB avec group by sur union
    Par panini182 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/07/2005, 17h58

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