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 :

Condition dans clause Where


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2011
    Messages : 41
    Points : 33
    Points
    33
    Par défaut Condition dans clause Where
    Bonjour à tous,

    J'ai une problématique. J'ai une table contenant les informations de clients regroupé par contrat (avec un numéro adhérent par contrat) et par garantie. Par exemple :
    numéro rang cspcot formule
    125 1 NA plus
    125 2 T amel
    126 1 RG normal
    127 1 NA sant
    127 2 NA sant
    127 3 RL plus
    128 1 RG normal
    128 2 RG normal
    128 3 NA sant

    Toutes les personnes dans cette table avec le même numéro d'adhérent sont donc sous un même contrat (une famille). Le rang correspond au nombre de personne dans la famille, 1 étant pour le responsable du contrat, 2-3-4... pour les bénéficiaires.
    J'ai besoin de faire une requête qui me renvois la liste des adhérents ayant une cspcot = 'NA', ainsi que la famille même si le rang 1 est en 'NA', même si elle n'est pas 'NA'. Le résultat si je reprend mon tableau d'exemple devrait donc me donner :

    numéro rang cspcot formule
    125 1 NA plus
    125 2 T amel
    127 1 NA sant
    127 2 NA sant
    127 3 RL plus
    128 3 NA sant

    Je n'arrive pas à trouver comment faire cette requête, pouvez-vous m'aider ?

    Voici ce que j'ai déjà essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT numero, rang, cspcot, formule
    FROM matable 
    WHERE ((rang=1 AND cspcot='NA') OR rang<>1)
    Cela fonctionne "presque", j'ai bien mes adhérent rang 1 NA et leur famille, mais j'ai aussi toute les famille dont les rang 1 ne sont pas NA sans les rang 1...

    Voilà, j'espère que ma demande est "claire" c'est un peu compliqué à expliquer.

    Merci d'avance pour votre aide

  2. #2
    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
    bonjour,

    pour la 1ere condition il faut passer par un test d'existance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select *
    from tmp a
    where rang > 1 and cspcot = 'NA' or exists (select 1 from tmp b where a.numero = b.numero and b.rang = 1 and b.cspcot = 'NA')

    Si vous avez beaucoup de donnée et que vous voulez passer par des index, enlevez le OR et faites deux requetes uni par un UNION

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2011
    Messages : 41
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par punkoff Voir le message
    bonjour,

    pour la 1ere condition il faut passer par un test d'existance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select *
    from tmp a
    where rang > 1 and cspcot = 'NA' or exists (select 1 from tmp b where a.numero = b.numero and b.rang = 1 and b.cspcot = 'NA')
    Si vous avez beaucoup de donnée et que vous voulez passer par des index, enlevez le OR et faites deux requetes uni par un UNION
    Merci pour ta réponse Punkoff,
    J'ai essayé cela ne me donne pas le résultat attendu, car il me donne que les personnes 'NA'.

    En fait pour expliquer ça plus simplement, j'ai besoin d'avoir la liste des personnes de rang 1 obligatoirement 'NA', ainsi que les personnes ratachées à leur contrat peu importe leur cspcot.
    En gros, tous les rang 1 sont 'NA', les autres rang peu importe du moment que la personne en rang 1 ayant le même numéro adhérent qu'eux soit en 'NA'.

    J'ai essayé avec cette requête en Union :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT numero, rang, cspcot, formul 
    FROM tmp
    WHERE nuordp=1 AND cspcot='NA'
    UNION
    SELECT numero, rang, cspcot, formul 
    FROM tmp 
    WHERE nuordp>1
    Ça ne marche pas du tout car ça colle en dessous de tous les rang 1 'NA' tout le reste. N'y a-t-il pas un autre opérateur que UNION qui permet dans la deuxième requete de ne récupérer que ce qui colle avec les numéros adhérent de la première ?

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 910
    Points
    38 910
    Billets dans le blog
    9
    Par défaut
    l'expression de besoin n'est pas très claire, car dans le 1er exemple du post de ce jour à 10h31, la famille de l'adhérent 128 rang 3 est donnée comme résultat attendu et pourtant le 128 rang 1 a un CSPCOT = RG

    Donc si le besoin est
    - les rangs 1 si et seulement si leur CSPCOT est égal à "NA"
    - les autres rangs, si le CSPCOT de l'individu de rang 1 de même numéro est égal à "NA"

    alors la requête est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select numero, rang, cspcot, formul
    from  matable main
    where exists
         (select 1 from matable subq
           where  subq.numero  = main.numero
             and  subq.rang    = 1
             and  subq.cspcot = 'NA')

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2011
    Messages : 41
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    l'expression de besoin n'est pas très claire, car dans le 1er exemple du post de ce jour à 10h31, la famille de l'adhérent 128 rang 3 est donnée comme résultat attendu et pourtant le 128 rang 1 a un CSPCOT = RG

    Donc si le besoin est
    - les rangs 1 si et seulement si leur CSPCOT est égal à "NA"
    - les autres rangs, si le CSPCOT de l'individu de rang 1 de même numéro est égal à "NA"
    Oui excusez moi, j'ai oublié une clause, mon besoin est :
    - les rangs 1 si et seulement si leur CSPCOT est égal à "NA"
    - les autres rangs, si le CSPCOT de l'individu de rang 1 de même numéro est égal à "NA" OU si lui-même est égal à 'NA' (mais dans ce dernier cas sans afficher le rang 1 correspondant)

    C'est compliqué j'en convient :/

  6. #6
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Donc, en résumé (corrigez-moi si je me trompe):
    • Toutes les lignes où le spcot est à 'NA' seront dans le résultat (avec ou sans rang 1)
      Si en plus le rang est à 1, on prend toutes les lignes du même numéro


    Dans ce cas, deux actions :
    • extraire les lignes dont le spcot est à NA
    • repasser sur la table si jamais on trouve un rang 1 en plus pour y extraire les données de même numéro

    Il suffit ensuite de regrouper les résultats de ces deux actions et enlever les lignes qui seront en double (cad les lignes de rang 1).


    J'ai essayé avec 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    with 
    	na_1_query as 
    	(
    		select b.numero, b.rang, b.cspcot, b.formule
    		from mytable as  a
    		inner join
    		mytable as b
    		on 
    		(a.cspcot = 'NA' and a.rang = 1 and a.numero = b.numero)
    	),
    	na_query as
    	(
    		select numero, rang, cspcot, formule
    		from mytable
    		where cspcot = 'NA'
    	),
    	union_query as (
    		select *
    		from na_1_query
    		union all
    		select * from na_query
    	)
    select distinct numero, rang, cspcot, formule
    from union_query
    Ca marche selon ce que tu veux faire. Après, on peut trouver plus optimal.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Essayez comme 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
    15
    16
    select numero, rang, cspcot, formule
      from matable
     where cspcot  = 'NA'
        or numero in (select numero
                        from matable
                       where rang   = 1
                         and cspcot = 'NA');
     
        NUMERO       RANG CSPCOT FORMULE
    ---------- ---------- ------ -------
           125          1 NA     plus    
           125          2 T      amel    
           127          1 NA     sant    
           127          2 NA     sant    
           127          3 RL     plus    
           128          3 NA     sant

  8. #8
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Il ne faut pas ramener aussi le RANG 1 même s'il n'est pas NA du moment qu'un RANG > 1 du même contrat est NA ?

    Code sql : 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
     
    -- toutes les personnes NA
    select numero, rang, cspcot, formule
    from matable
    where cspcot = 'NA'
    union all
    -- toutes les familles où RANG 1 = NA
    select numero, rang, cspcot, formule
    from matable
    where numero in (select numero from matable where rang = 1 and cspcot = 'NA')
    and rang > 1 and cspcot <> 'NA'
    union all
    -- tous les RANG 1 des familles pour lesquels un membre est NA
    select numero, rang, cspcot, formule
    from matable
    where rang = 1 and numero in (select numero from matable where rand > 1 and cspcot = 'NA')
    and cspcot  <> 'NA'

    J'ai bon ?

    En tout cas, ça doit être simplifiable
    On ne jouit bien que de ce qu’on partage.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2011
    Messages : 41
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Essayez comme 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
    15
    16
    select numero, rang, cspcot, formule
      from matable
     where cspcot  = 'NA'
        or numero in (select numero
                        from matable
                       where rang   = 1
                         and cspcot = 'NA');
     
        NUMERO       RANG CSPCOT FORMULE
    ---------- ---------- ------ -------
           125          1 NA     plus    
           125          2 T      amel    
           127          1 NA     sant    
           127          2 NA     sant    
           127          3 RL     plus    
           128          3 NA     sant
    Merci beaucoup Waldar, cette requête fonctionne à la perfection !
    Et un grand merci à tous pour votre aide

  10. #10
    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
    Par curiosité quel sgbd utilisez vous ?

    Ma requete ou celle de Waldar doivent ramener le même résultat au vu des priorités des opérateurs booléen

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2011
    Messages : 41
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par punkoff Voir le message
    Par curiosité quel sgbd utilisez vous ?

    Ma requete ou celle de Waldar doivent ramener le même résultat au vu des priorités des opérateurs booléen
    Il s'agit d'un système AS400 dont nous avons accès via le serveur de notre prestataire, au travers duquel je fais mes requêtes SQL. Je ne saurais pas vous en dire plus...

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

Discussions similaires

  1. [t-sql] instruction CASE dans clause WHERE
    Par ignitionflip dans le forum Langage SQL
    Réponses: 4
    Dernier message: 22/01/2007, 18h07
  2. Réponses: 8
    Dernier message: 16/11/2006, 13h31
  3. Select dans clause Where
    Par Bisûnûrs dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/08/2006, 11h50
  4. [PL/SQL Oracle] Syntaxe dans clause where
    Par Misdrhaal dans le forum Oracle
    Réponses: 2
    Dernier message: 01/03/2006, 13h33
  5. INNER JOIN ... ON ... ou jointure dans clause where
    Par schmur1 dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 28/06/2005, 09h16

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