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 :

Probleme requete pour retourner le nombre de personne [11g]


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut Probleme requete pour retourner le nombre de personne
    Bonjour,
    j'ai un petit soucis au niveau d'une requete, j'essaye de quantifier le nombre de personne, en fonction de certains critère mais je n'obtient pas les bons résultats.
    Je cherche à avoir le nombre de personne qui ont :
    un taux horaire=25 et type taux=h ( dont 25h hebdomadaire ) ou un taux inferieur à 122 h mensuel (
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT count(t4.idsalarie) as Nombre_salarie
    FROM TableNomi t1
    INNER JOIN tableAnne t2 ON t2.ID = t1.idrefTableNomi
    INNER JOIN dossier1 t3 ON t3.ID = t1.IDrefDossier1 
    INNER JOIN personne t4 ON t4.ID = t3.IDrefpersonne
    WHERE    t2.annee='2017'
    and t1.HORAIRE=25 and t1.typehoraire='H'  //cas 1
    or t1.HORAIRE<122 and t1.typehoraire='M' //cas 2
    quand je lance la requête en mettant en commentaire la 2eme condtion ( j'enleve la ligne cas 2 ) j'ai 31personnes.
    J’enlève la ligne cas 1, donc je laisse " and t1.HORAIRE<122 and t1.typehoraire='M' " : j'obtiens 3127
    donc résultat logique si je laisse les 2 conditions : 3158

    Maintenant je laisse les deux conditions, j’obtiens un nombre supérieur à 100 000 personnes donc le résultat est faussé, auriez vous une idée ? Un grand merci :!

  2. #2
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Avec des parenthèses je pense que ça peut passer; n'oubliez pas que AND est > à OR en terme de précédence.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Telle que vous avez écrit votre requête, en prenant en compte la précédence des opérateurs l'expression de restriction est évaluée ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WHERE   (   t2.annee='2017'
            and t1.HORAIRE=25 
            and t1.typehoraire='H' 
            )   //cas 1
        or  (   t1.HORAIRE<122 
            and t1.typehoraire='M' 
            )   //cas 2
    La condition t2.annee='2017' n'est pas prise en compte dans le cas 2.

    L'ajout de parenthèses permet de corriger cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WHERE   t2.annee='2017'
        and (   (   t1.HORAIRE=25 
                and t1.typehoraire='H' 
                )   //cas 1
            or  (   t1.HORAIRE<122 
                and t1.typehoraire='M' 
                )   //cas 2
            )
    Ou plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WHERE   t2.annee='2017'
        and (       t1.HORAIRE=25 
                and t1.typehoraire='H'  //cas 1
            or      t1.HORAIRE<122 
                and t1.typehoraire='M'  //cas 2
            )
    L'indentation du code permet de bien mettre en évidence les regroupement d'expressions logiques.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut
    ok, j'ai fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT count(t4.idsalarie) as Nombre_salarie
    FROM TableNomi t1
    INNER JOIN tableAnne t2 ON t2.ID = t1.idrefTableNomi
    INNER JOIN dossier1 t3 ON t3.ID = t1.IDrefDossier1 
    INNER JOIN personne t4 ON t4.ID = t3.IDrefpersonne
    WHERE    t2.annee='2017'
    and ((t1.HORAIRE=35 ) or (t1HORAIRE<=122))
    apparemment je n'avais pas à me soucier du code.

    Par contre, j'ai test une autre méthode car à ma requête , je souhaite ajouter le nombre de personne avec un taux horaire =39 ou =169
    J'ai essayé la requete suivante :


    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
    25
     
    SELECT 
    (
    select count(t4.idsalarie) as Nombre_salarie
    FROM TableNomi t1
    INNER JOIN tableAnne t2 ON t2.ID = t1.idrefTableNomi
    INNER JOIN dossier1 t3 ON t3.ID = t1.IDrefDossier1 
    INNER JOIN personne t4 ON t4.ID = t3.IDrefpersonne
    WHERE    t2.annee='2017'
    and ((t1.HORAIRE=35 ) or (t1HORAIRE<=122))
    ) as nb_sal_35,
    (
    select count(t4.idsalarie) as Nombre_salarie
    FROM TableNomi t1
    INNER JOIN tableAnne t2 ON t2.ID = t1.idrefTableNomi
    INNER JOIN dossier1 t3 ON t3.ID = t1.IDrefDossier1 
    INNER JOIN personne t4 ON t4.ID = t3.IDrefpersonne
    WHERE    t2.annee='2017'
    and ((t1.HORAIRE=39 ) or (t1HORAIRE<=169))
    ) as nb_sal_39
    FROM TableNomi t1
    INNER JOIN tableAnne t2 ON t2.ID = t1.idrefTableNomi
    INNER JOIN dossier1 t3 ON t3.ID = t1.IDrefDossier1 
    INNER JOIN personne t4 ON t4.ID = t3.IDrefpersonne
    WHERE    t2.annee='2017'
    j'ai compté le nombre de ligne mais il y en a 75 000 et des poussieres, j'aimerais juste avoir en résultats
    nb_sal_35 : 2850 par exemple
    nb_sal_39 : 3698 par ex
    mais pas une liste de resultat, en gros quand je fais ma requete avec mes 2 counts à la suite, j'ai ma liste de resultats et si je met pas le bloc from a la fin il me met une erreur, comment puis-je faire pour avoir que le resultats de mes 2 counts ? et donc de mes 2 requetes,
    merci

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Une manière de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT  SUM(CASE WHEN t1.HORAIRE = 35 OR t1HORAIRE <= 122 THEN 1 END)  AS nb_sal_35
        ,   SUM(CASE WHEN t1.HORAIRE = 39 OR t1HORAIRE <= 169 THEN 1 END)  AS nb_sal_39
    FROM    TableNomi t1
        INNER JOIN 
            tableAnne t2 
            ON t2.ID = t1.idrefTableNomi
        INNER JOIN 
            dossier1 t3 
            ON t3.ID = t1.IDrefDossier1 
        INNER JOIN 
            personne t4 
            ON t4.ID = t3.IDrefpersonne
    WHERE   t2.annee = '2017'
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut
    ok merci je vais regarder ça

  7. #7
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut
    les resultats m'ont l'air probant, un grand merci à toi

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/07/2008, 11h06
  2. Probleme requete pour lister les banques de boites aux lettres
    Par spykopat dans le forum Exchange Server
    Réponses: 1
    Dernier message: 20/08/2007, 11h56
  3. [8.5]Problème pour calculer le nombre des personnes d'une liste
    Par Gotch59 dans le forum SAP Crystal Reports
    Réponses: 9
    Dernier message: 21/06/2007, 09h47
  4. Requête pour compter le nombre de fils de chaque parent
    Par santana2006 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 25/08/2006, 16h08
  5. Requete pour compter le nombre de champs
    Par kichemans dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/04/2006, 14h12

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