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 :

Count multiple : quelle méthode ?


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2010
    Messages : 347
    Points : 121
    Points
    121
    Par défaut Count multiple : quelle méthode ?
    Bonjour,

    je cherche à connaitre le nombre d'enregistrements d'une table à partir de sa clé primaire.
    Donc en théorie ça revient à faire
    sauf que dans mon cas, la clé primaire est constituée de 4 colonnes (deux colonnes varchar2 et 2 colonnes number). Et je ne trouve pas d'exemple sur Google pour ce cas de figure.
    J'ai déjà essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    count (champ1, champ2, ...)
    me renvoie une erreur
    ORA-00909: nombre d'arguments non valide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    count (champ1 + champ2 + ....)
    me renvoie une erreur.
    ORA-01722: Nombre non valide
    Pour le moment je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    count(champ1) + count(champ2) + ...
    mais j'ai un doute.

    Merci à ceux qui sauront m'expliquer laquelle est bonne et pourquoi.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Pourquoi pas count(*) ???

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2010
    Messages : 347
    Points : 121
    Points
    121
    Par défaut
    Le résultat est complètement différent entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    count (champ1) + count (champ2) + ...
    et
    donc j'avoue ne pas savoir

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Dans quel cas faites vous le count ?

    Est-ce sur une table issue d'une jointure externe ?

  5. #5
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    --> va compter (sans distinction de colonnes) le nombre d'enregistrements dans ta table.

    Tandis que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count (champ1) + count (champ2) + ...
    --> va faire la somme du nombre d'enregistrement du champ 1 et du nombre d'enregistrement du champ 2.
    ~ Lola ~

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2010
    Messages : 347
    Points : 121
    Points
    121
    Par défaut
    Euh non, simplement à des fins de test pour le moment.
    On m'a conseillé (vu que ce que je faisais était complètement faux) de récupérer les 4 champs et avec une requête imbriquée de calculer le résultat.

    comment on fait ça ?

  7. #7
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Tu n'as pas besoin de t'embêter à récupérer les 4 champs, en effet puisqu'il s'agit de la clé primaire alors pour chaque enregistrement de la table une valeur existe pour tes 4 champs.

    Le count(*) suffit largement pour ça.
    ~ Lola ~

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2010
    Messages : 347
    Points : 121
    Points
    121
    Par défaut
    Est-ce qu'il y a moyen d'en savoir un peu plus sur la façon dont est géré count(*) par Oracle ? Il doit bien concaténer les champs pour pouvoir compter non ?
    Comment est-ce qu'il les concatène ?

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par feldi Voir le message
    Est-ce qu'il y a moyen d'en savoir un peu plus sur la façon dont est géré count(*) par Oracle ? Il doit bien concaténer les champs pour pouvoir compter non ?
    Comment est-ce qu'il les concatène ?
    Qu'est ce que tu cherches à inventer là ?
    un count(*) va compter le nombre d’occurrences que ramène ta requête, indépendamment de la clef primaire ou du nombre de colonnes.

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2010
    Messages : 347
    Points : 121
    Points
    121
    Par défaut
    mais mais mais
    Donc finalement un count(*) simplement me ramènera le nombre de lignes qui ont cette clé primaire ?
    Et en plus ça règle le problème des doublons étant donné qu'une clé primaire est unique.

    Et pour une table qui n'a pas de clé primaire ? Comment on peut faire alors pour un count de plusieurs champs pour éviter les doublons ?

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par feldi Voir le message
    Donc finalement un count(*) simplement me ramènera le nombre de lignes qui ont cette clé primaire ?
    Il faudrait voir ta requête et les jointures qui sont dessus...

    Pourrais-tu nous fournir un exemple précis de ce que tu veux avec des tables de testes ou au moins avoir ta requête en entier avec la description des tables, parce que ton besoin initial reste encore assez vague.

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2010
    Messages : 347
    Points : 121
    Points
    121
    Par défaut
    Erf, je ne suis plus en entreprise la.
    Mais de tête :
    En gros, on a une table de devis (table A) et une table de devis détaillé (table B).
    Normalement, pour une ligne de la table A, on doit avoir une et une seule ligne dans la table B. Or après test, il se trouve qu'il y a plus de lignes dans la table B que dans la table A.

    Donc il faut retrouver dans la table A le nombre de lignes pour une période donnée sans doublons (table avec la clé primaire).
    Et ensuite même chose pour l'autre table qui n'a pas de clé primaire celle la.

    En fait, je dois faire ça pour retrouver des lignes "en trop" dans la table B qui ne devraient pas y être.

    Je sais que c'est vague, moi même j'ai un peu de mal à cerner tout le problème. Surtout que ça ne représente qu'une petite partie du projet.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Si c'est un problème de doublon, as-tu lu la note suivante de la FAQ ?
    http://oracle.developpez.com/faq/?page=3-1#doublons

  14. #14
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Et n'y aurai-t-il pas un problème de modélisation par la même occasion ?

  15. #15
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT a.pk, count(*)
    FROM a
      join b ON a.pk = b.pk
    GROUP BY a.pk
    HAVING count(*) > 1
    Ca te donne les PK de A qui dans B ont plusieurs lignes... mais on en saura bien plus quand tu seras à nouveau en entreprise pour donner un exemple concret et précis.

    Pour le count :
    count(*), c'est le nombre de ligne de :
    - ton groupe s'il y a un group by
    - ta requête entière sinon

    count(expr), c'est le nombre de lignes tout pareil qu'au dessus sauf qu'on ne compte pas les expr NULL ! "Expr" peut être une colonne, ou une expression plus complexe mixant colonnes, d'opérateurs, fonctions, constantes, ...

    count(DISTINCT expr), c'est le nombre d'occurrences distinctes de ton expr.

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  16. #16
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2010
    Messages : 347
    Points : 121
    Points
    121
    Par défaut
    Alors, mes requêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT DISTINCT id_Domain, id_Cart, num_version, num_line, count(*)
    FROM cla, dcf
    where date1 between '20110101' and '20111231'
        AND flag2 = 1 
        AND id_item <> 'multi-produits'
        AND id_item <> 'price List'
        AND id_item <> 'simu'
        AND dcf.idcart = cla.z_id_cart
        AND dcf.linequote = cla.num_line
    GROUP BY id_domain, id_cart, num_version, num_line;
    pour la table A (cla)

    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT DISTINCT idcart, linequote, numberofevo, count(*)
    FROM cla, dcf
    where dateoffer between '2011/01/01' and '2011/12/31'
        and dcf.idcart = cla.z_id_cart
        AND dcf.linequote = cla.num_line
    GROUP BY idcart, linequote, numberofevo;
    pour la table B (dcf).

    La première requête me renvoie 36592 lignes et la deuxième 40645.
    Donc il y a plus de lignes dans dcf que dans cla.

    J'ai donc essayé la requête de pacman :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT id_Domain, id_Cart, num_version, num_line, count(*)
    FROM cla
      JOIN dcf ON dcf.idcart = cla.z_id_cart
                       AND dcf.linequote = cla.num_line
                       AND date1 between '20110101' and '20111231'
                       AND flag2 = 1 
                       AND id_item <> 'multi-produits'
                       AND id_item <> 'price List'
                       AND id_item <> 'simu'
    GROUP BY id_Domain, id_Cart, num_version, num_line
    HAVING count(*) > 1 ;
    qui me renvoie 0 lignes et en changeant les tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT idcart, linequote, numberofevo, count(*)
    FROM dcf
      JOIN cla ON dcf.idcart = cla.z_id_cart
                                                AND dcf.linequote = cla.num_line
                                                AND dateoffer between '2011/01/01' and '2011/12/31'
    GROUP BY idcart, linequote, numberofevo
    HAVING count(*) > 1 ;
    qui me renvoie également 0 lignes.
    Y a un truc qui a du m'échapper la, étant donné qu'il y a 4050 lignes de plus dans la deuxième table.

  17. #17
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Bonjour,

    Tu n'as peut-être pas bien compris le fonctionnement du having count(*) >1.

    Il te permet de retourner les lignes telles que leur count est supérieur à 1.

    Un exemple pour illustrer ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT id, count(*) Cnt
    FROM MaTable
    id | Cnt
    1 | 1
    2 | 1
    3 | 2

    SELECT id, count(*) Cnt
    FROM MaTable
    HAVING count(*) > 1
    Est-ce que ce que tu voudrais faire c'est pas plutôt une différence entre les deux tables ? Dans ce cas ce tuto pourrait bien t'aider.
    ~ Lola ~

  18. #18
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2010
    Messages : 347
    Points : 121
    Points
    121
    Par défaut
    OK, je vais m'orienter la dessus.

    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
     
    SELECT dcf.idcart, dcf.linequote
    FROM dcf, cla
    WHERE dcf.dateoffer between '2011/03/01' and '2011/03/31' 
        AND  dcf.idcart = cla.z_id_cart
        AND dcf.linequote = cla.num_line
    EXCEPT 
    SELECT cla.id_Cart, cla.num_line
    FROM cla, dcf
    WHERE dcf.idcart = cla.z_id_cart
        AND dcf.linequote = cla.num_line
        AND cla.date1 between '20110301' and '20110331'
        AND cla.flag2 = 1 
        AND cla.id_item <> 'multi-produits'
        AND cla.id_item <> 'price List'
        AND cla.id_item <> 'simu';
    Si j'ai bien compris l'exemple : on prend les lignes de dcf - les lignes de cla ?

    Par contre j'ai un message d'erreur :
    Error at line 3
    ORA-00933: la commande SQL ne se termine pas correctement
    On ne peut pas mettre de conditions avec cette structure ? ça me parait bizarre.

  19. #19
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Il me semble que dans oracle (d'après le tuto) il faille utiliser MINUS à la place d'EXCEPT.

    P.S : Par contre ici tu ne fais pas juste la différence entre dcf et cla car tes deux tables sont présentes dans tes deux requêtes.
    ~ Lola ~

  20. #20
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2010
    Messages : 347
    Points : 121
    Points
    121
    Par défaut
    Effectivement, avec MINUS, la requête me donne un résultat.
    Par contre, la requête me renvoie le nombre de lignes de dcf, non la différence.
    J'ai testé en enlevant les jointures des select mais j'obtiens un résultat supérieur au nombre de lignes initial de dcf.

    Lola06, j'ai bien lu ton PS mais il faut bien que je garde les jointures pour être sur de tester les bonnes lignes non ? Comment faire ça alors ?

    J'affine pour le moment sur le mois de mars et je devrais trouver une différence de 307 lignes normalement.

Discussions similaires

  1. Quelles méthodes utiliser ?
    Par Ekinoks dans le forum OpenGL
    Réponses: 2
    Dernier message: 29/09/2005, 14h45
  2. Réponses: 4
    Dernier message: 05/06/2005, 14h05
  3. [C#] Form : Quelles méthodes ? Close, Dispose, Show, Hide
    Par TheSeb dans le forum Windows Forms
    Réponses: 9
    Dernier message: 30/05/2005, 16h42
  4. [persistance]Quelle méthode utiliser ?
    Par le Daoud dans le forum Persistance des données
    Réponses: 9
    Dernier message: 15/11/2004, 09h29
  5. code récurrent, quelle méthode utiliser ?
    Par khayyam90 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 10/10/2004, 15h03

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