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 :

Jointure sur select count


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2008
    Messages : 41
    Par défaut Jointure sur select count
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT * FROM v$version ;
    Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
    je souhaite réaliser une jointure sur 2 select count mais je ne sais pas si c'est réalisable. Voici mes 2 select :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select count(*) as nb_rejected, substr(date,8,10) as YEAR
    from table1
    where datecloture is null
    group by substr(date,8,10)
    order by substr(date,8,10)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select count(*) as nb_total, substr(date,8,10) as YEAR
    from table1
    group by substr(date,8,10)
    order by substr(date,8,10)
    Merci !

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT count(*) AS nb_total, 
           count(Case When datecloture IS NULL Then 1 End) AS nb_rejected,
           substr(date,8,10) AS YEAR
    FROM table1
    GROUP BY substr(date,8,10)
    ORDER BY substr(date,8,10)

  3. #3
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2008
    Messages : 41
    Par défaut
    Merci !!!

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Une autre méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      SELECT count(*)                      AS nb_total
           , count(*) - count(datecloture) AS nb_rejected
           , substr(date, 8, 10)           AS year
        FROM table1
    GROUP BY substr(date, 8, 10)
    ORDER BY substr(date, 8, 10) asc;

  5. #5
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    substr(date, 8, 10) AS year
    Une année sur 10 chiffres, c'est style l'an 1'000'000'001 après Jésus-Christ ?


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

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Au passage, si c'est la date est en char, c'est un peu laid...

    ... et si elle est en date, on préfèrera to_char(date, 'YY')

  7. #7
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Au passage, si c'est la date est en char, c'est un peu laid...

    ... et si elle est en date, on préfèrera to_char(date, 'YY')
    Au jeu des Chiffres et des Lettres, je préfère les chiffres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extract(year from date)
    à moins bien sûr de vouloir grouper les grand-mères de 1910 avec les filles de 2010

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

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Bien vu, surtout que si on tient absolument à tronçonner les grand-mères et les filles, on peut aussi le faire avec mod 100

  9. #9
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    mouais, mais à condition que les grand-mères ne soient pas trop vieilles, sinon le mod va coincer...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select mod(extract(year from date '-1910-01-01'),100) from dual
    -10

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Entre 1910 et 2010, ça fait quand même des bébés en moyenne à 50 ans pour n'être que grand-mère !

  11. #11
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    mais quelle est la différence d'âge entre ta grand-mère et ta fille?

    Ma fille a 9 ans et ma grand-mère bientôt 96, ça fait presque un siècle, non

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

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Ah ben là Laurent, c'est un dur réveil pour moi qui ai passé 30 ans à croire que le reste de la division Euclidienne est positif !

    Sur Wikipedia, l'extension de la division Euclidienne dans Z, ils insistent sur l’existence, et indiquent que l'unicité "ne peut être établie qu'en imposant une condition supplémentaire" puis citent deux cas...
    http://fr.wikipedia.org/wiki/Division_euclidienne

    Sur un random pdf, ils définissent comme positif le reste de la division Euclidienne d'un entier relatif :
    http://www.google.fr/url?sa=t&source...5sCmQS7guvVtMg

    Ah ben finalement, c'est bien Oracle qui a implémenté le truc un peu différemment :
    This function behaves differently from the classical mathematical modulus function when m is negative. The classical modulus can be expressed using the MOD function with this formula:

    m - n * FLOOR(m/n)


    http://download.oracle.com/docs/cd/B...nctions088.htm

    Du coup Waldar, entre la fille en l'an 10 et la grand-mère en -10, on a l'effet inverse

  13. #13
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    on pourrait aussi employer REMAINDER(-1910,100), non? MOD est effectivement une bizarrerie Oracle. En particulier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select mod(123,0) from dual
    123

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

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    En tous cas sur le coup du signe du reste, ça donne la même chose chez moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SQL> select REMAINDER(-1910,100) from dual
      2  /
     
    REMAINDER(-1910,100)
    --------------------
                     -10
    Puis pour le coup du 0, c'est le débat entre avoir une requête qui claque ou un résultat arbitraire

  15. #15
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    je me suis planté ce coup ci ...

    j'avais testé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT REMAINDER(-1990,100) FROM dual
    10

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

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Mouais, j'ai un peu du mal à saisir la doc Oracle quand même :

    http://download.oracle.com/docs/cd/B...nctions133.htm
    Citation Envoyé par Doc Oracle
    REMAINDER returns the remainder of n2 divided by n1
    ...
    The MOD function is similar to REMAINDER except that it uses FLOOR in its formula, whereas REMAINDER uses ROUND. Please refer to MOD.
    ...
    If n1 != 0, then the remainder is n2 - (n1*N) where N is the integer nearest n2/n1.

    ...
    Bon donc la doc dit que REMAINDER prend l'arrondi n2/n1 alors que MOD prend le floor ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SQL> select mod(-1910, 100), -1910 - 100 * floor(-1910 / 100) as modeuh from dual;
     
    MOD(-1910,100)     MODEUH
    -------------- ----------
               -10         90
    Effectivement, vu que dans la description de mod ils disaient justement que MOD ne fonctionne pas comme ça...

    Cela dit, je trouve que REMAINDER, c'est vraiment extrêmement laid :
    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
     
    SQL> select -level a, 5 b, mod(-level, 5) rmod, remainder(-level, 5) rrem, -level - floor(-level / 5) * 5 rmath
      2  from dual
      3  connect by level <= 10;
     
             A          B       RMOD       RREM      RMATH
    ---------- ---------- ---------- ---------- ----------
            -1          5         -1         -1          4
            -2          5         -2         -2          3
            -3          5         -3          2          2
            -4          5         -4          1          1
            -5          5          0          0          0
            -6          5         -1         -1          4
            -7          5         -2         -2          3
            -8          5         -3          2          2
            -9          5         -4          1          1
           -10          5          0          0          0
     
    10 ligne(s) sÚlectionnÚe(s).
    Car autant 4 et -1 (-3 et 2; -2 et 3) c'est la même chose vis à vis de Z/Z5, autant le côté miroir induit par le round me semble insupportable ! (question de goût peut être )

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

Discussions similaires

  1. De l'aide pour Jointure, avec selection count =0
    Par onemart dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/01/2009, 09h01
  2. select count avec jointure, en récupérant les 0
    Par littlewings dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/07/2008, 11h58
  3. select count (*) sur 3 tables
    Par jbidou88 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/05/2008, 13h43
  4. Problème de jointure sur Select et Update
    Par Marshall_Mathers dans le forum Langage SQL
    Réponses: 7
    Dernier message: 20/06/2007, 15h30
  5. Réponses: 3
    Dernier message: 08/11/2006, 23h04

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