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 Multiple et Jointure


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 106
    Par défaut Count Multiple et Jointure
    Bonjour

    J'ai deux tables représentées très brièvement sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    PRESTATION
    IDENTIFIER   NAME
    
    OBSERVATION
    IDENTIFIER NAME IDENTIFIER_PRESTATION VALIDITY
    J'aimerais obtenir pour une prestation le nombre d'observation ayant une 'validity' valant 'N', et le nombre d'observation ayant une 'validity' valant 'V'. Le tout dans une seule requête.

    Le résultat de la forme
    IDENTIFIER de la prestation Nbre d'obs V Nbre d'obs N

    Ca ne me semble pas compliqué, mais j'ai essayé plusieurs solutions mais c'était toujours un peu farfelus ...

    Du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT     p.*, COUNT
                              (SELECT     *
                                FROM          PRESTATION p INNER JOIN
                                                   OBSERVATION o ON p.IDENTIFIER = o.IDENTIFIER_PRESTATION
                                WHERE      p.IDENTIFIER = 'PRESTATION__________0000115545' AND validity = 'N')
    FROM        PRESTATION
    Merci

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 135
    Par défaut
    En combinant ces deux sources d'information, tu devrais construire une requête plus cohérente :

    Cours sur les Jointures en SQL
    Cours sur les Regroupements en SQL
    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.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 106
    Par défaut
    En continuant à chercher un peu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT     p.IDENTIFIER, valide.cnt AS EXPR1, nonvalide.cnt AS EXPR2
    FROM         PRESTATION p CROSS JOIN
                              (SELECT     COUNT(*) AS cnt
                                FROM          OBSERVATION o, PRESTATION
                                WHERE      o.VALIDITY = 'N' AND PRESTATION.IDENTIFIER = o.IDENTIFIER_PRESTATION) nonvalide CROSS JOIN
                              (SELECT     COUNT(*) AS cnt
                                FROM          OBSERVATION o, PRESTATION
                                WHERE      o.VALIDITY = 'V' AND PRESTATION.IDENTIFIER = o.IDENTIFIER_PRESTATION) valide
    Bon c'est pas encore ça ... Il me donne à chaque prestation le nombre total d'observations valide et le nombre total d'observation invalides.

    Ca me semblait un bon début.
    Je te remercie de ta réponse.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 106
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT     p.IDENTIFIER, COUNT(*) AS valide
    FROM         PBR_TP_OBSERVATION o INNER JOIN
                          PBR_TP_PRESTATION p ON o.IDENTIFIER_PRESTATION = p.IDENTIFIER
    WHERE     (o.VALIDITY = 'N')
    GROUP BY p.IDENTIFIER
    Mais je n'arrive toujours pas à trouver comment je peux afficher les 2 .

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 135
    Par défaut
    Pourquoi faire aussi compliqué ?
    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
    SELECT  p.identifier
        ,    COALESCE(valide.cnt, 0) AS valide
        ,    COALESCE(nonvalide.cnt, 0) AS nonvalide
    FROM    prestation AS p
        LEFT JOIN
            (   SELECT  identifier_prestation
                    ,   count(*) AS cnt
                FROM    observation 
                WHERE   validity = 'Y'
                GROUP BY identifier_prestation
            )   AS valide
            ON  p.identifier = valide.identifier_prestation
        LEFT JOIN
            (   SELECT  identifier_prestation
                    ,   count(*) AS cnt
                FROM    observation
                WHERE   validity = 'N'
                GROUP BY identifier_prestation
            )   AS nonvalide
            ON  p.identifier = nonvalide.identifier_prestation
    ;
    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
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 135
    Par défaut
    Encore plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT  p.identifier
        ,   SUM(CASE WHEN o.validity = 'Y' THEN 1 ELSE 0 END) AS valide
        ,   SUM(CASE WHEN o.validity = 'N' THEN 1 ELSE 0 END) AS nonvalide
    FROM    prestation AS p
        LEFT JOIN
            observation AS o 
            ON  p.identifier = o.identifier_prestation
    GROUP BY p.identifier
    ;
    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.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 106
    Par défaut
    Je te remercie de tes réponses.

    Quand je pars sur une voie, j'ai toujours des difficultés à essayer de trouver une autre solution ...

    Pour l'intégration à ma requête, ta première proposition est la plus évidente. Mais j'ai au moins appris qqch quant à la requête num 2.

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

Discussions similaires

  1. problème de requete: COUNT() multiples
    Par nicolemans72 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/02/2007, 10h06
  2. UPDATE multiple avec jointure
    Par PyRoFlo dans le forum Requêtes
    Réponses: 6
    Dernier message: 25/05/2006, 15h56
  3. COUNT dans une jointure
    Par picsoun dans le forum Langage SQL
    Réponses: 4
    Dernier message: 03/04/2006, 20h27
  4. [MySQL] count multiple
    Par kostia dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/02/2006, 10h05
  5. un count sur une jointure et ca ne fonctionne pas
    Par elbronziero dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/10/2004, 11h23

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