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 :

Comment récupérer le count dans une sous requête pour l'utiliser en filtre dans la requête


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Octobre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Octobre 2016
    Messages : 109
    Points : 162
    Points
    162
    Par défaut Comment récupérer le count dans une sous requête pour l'utiliser en filtre dans la requête
    Bonjour,

    J'utilise Sqlview pour faire des requêtes dans une SGBD Oracle, je voudrais compléter ma requête ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select a.itmref_0, a.bomalt_0 ,(select count (*) as cpt from bomd d where  a.itmref_0=d.itmref_0 and a.bomalt_0=d.bomalt_0)
      from mdptst.bom a
       where a.bomalt_0=94 and (a.itmref_0 like '10%' or a.itmref_0 like '20%') and a.usesta_0=2 and a.bomalttyp_0=2 and
       exists ( select *
                    from bomd b
                    where a.itmref_0=b.itmref_0 and a.bomalt_0=b.bomalt_0   and b.cpnitmref_0 like '20RB%'
                  )
                  and
       not exists ( select *
                   from bomd c
                   where   a.itmref_0=c.itmref_0 and a.bomalt_0=c.bomalt_0  and c.cpnitmref_0 not like '20RB%'
                  ) ;

    dans une gestion des nomenclatures d'articles, j'utilise deux tables : bom qui est la table d'entête et bomd qui est la table de détail, je peux avoir n enregistrement dans bomd pour un seul enregistrement dans bom selon le nombre d'article dans la nomenclature.

    l'idée est d'extraire les nomenclatures (donc je part de la table d'entête bom), ayant un article qui commence par '20RB' dans la table de détail (ça fonctionne via l'instruction exists) et j'exclus les nomenclatures qui ont un article différent de '20RB' (ça fonctionne aussi via l'instruction not exists ). par contre je ne sais pas comment faire pour exclure les nomenclatures ayant plusieurs enregistrements, donc plusieurs lignes de l'article 20RB, j'ai fait une sous requête pour compter le nombre d’enregistrement mais je ne sais pas comment je peux faire pour exclure quand j'ai un nombre d'enregistrement supérieur à 1.

    Merci pour votre aide
    Cordialement,

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Bonsoir,
    Plusieurs solutions, par exemple vous faites une sous requete de comptage avec having count(*) > 1 que vous encapsulez dans un not exists
    Ou bien vous ajoutez une auto-jointure sur la table bomd en vérifiant que les 2 lignes jointes sont différentes, là aussi, vous encapsulez dans un not exists
    D'autres solutions possibles en fonction du contenu de bomd (présence d'horodatage ou de chrono unique par exemple...)

  3. #3
    Membre habitué
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Octobre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Octobre 2016
    Messages : 109
    Points : 162
    Points
    162
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Bonsoir,
    Plusieurs solutions, par exemple vous faites une sous requete de comptage avec having count(*) > 1 que vous encapsulez dans un not exists
    Ou bien vous ajoutez une auto-jointure sur la table bomd en vérifiant que les 2 lignes jointes sont différentes, là aussi, vous encapsulez dans un not exists
    D'autres solutions possibles en fonction du contenu de bomd (présence d'horodatage ou de chrono unique par exemple...)
    Merci Bcp escartfigue, effectivement avev un having et not existe C est top

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Le not exists semble même inutile ici.
    Si on résume le besoin, vous cherchez les nomenclatures ayant exactement un article, et que cet unique article commence par '20RB'

    Je ferai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    select a.itmref_0, a.bomalt_0
    from mdptst.bom a
    INNER JOIN (
        SELECT itmref_0 , bomalt_0
        FROM bomd 
        GROUP BY itmref_0 , bomalt_0
        HAVING COUNT(*) = 1 
        AND COUNT(CASE WHEN cpnitmref_0 like '20RB%' THEN 1 END) = 1
    ) b
        ON a.itmref_0=b.itmref_0 and a.bomalt_0=b.bomalt_0
     
       where a.bomalt_0=94 and (a.itmref_0 like '10%' or a.itmref_0 like '20%') and a.usesta_0=2 and a.bomalttyp_0=2 and
    ;

  5. #5
    Membre habitué
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Octobre 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Octobre 2016
    Messages : 109
    Points : 162
    Points
    162
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour

    Le not exists semble même inutile ici.
    Si on résume le besoin, vous cherchez les nomenclatures ayant exactement un article, et que cet unique article commence par '20RB'

    Je ferai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    select a.itmref_0, a.bomalt_0
    from mdptst.bom a
    INNER JOIN (
        SELECT itmref_0 , bomalt_0
        FROM bomd 
        GROUP BY itmref_0 , bomalt_0
        HAVING COUNT(*) = 1 
        AND COUNT(CASE WHEN cpnitmref_0 like '20RB%' THEN 1 END) = 1
    ) b
        ON a.itmref_0=b.itmref_0 and a.bomalt_0=b.bomalt_0
     
       where a.bomalt_0=94 and (a.itmref_0 like '10%' or a.itmref_0 like '20%') and a.usesta_0=2 and a.bomalttyp_0=2 and
    ;
    Merci bcp c est top

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/05/2016, 14h02
  2. Utilisation de Having dans une sous-requête
    Par ultimus dans le forum Langage SQL
    Réponses: 6
    Dernier message: 18/05/2014, 23h01
  3. Utilisation de colonnes dans une sous-requête
    Par boubacach dans le forum SQL
    Réponses: 5
    Dernier message: 31/05/2010, 10h55
  4. impossible d'utiliser LIMIT 1 dans une sous-requête
    Par Christophe Charron dans le forum Requêtes
    Réponses: 13
    Dernier message: 19/12/2009, 22h42
  5. Réponses: 6
    Dernier message: 09/04/2009, 12h36

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