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 :

group by ou autre


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
    Janvier 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 62
    Par défaut group by ou autre
    Salut les pros !
    J'aurai besoin d'un coup de main car je sèche.
    J'ai une table avec 3 colonnes
    col1 col2 col3
    ---------------------
    A | 1 | AA
    A | 2 | AA
    B | 1 | BB
    C | 3 | AA
    C | 2 | AA
    C | 1 | BB

    je cherche à faire ceci :
    je cherche tous les col1 qui peuvent répondre à col2 et col3 = 1 AA (condition1) et 2 AA (condition2)
    Je pensais qu'avec le GROUP BY cela permettait de tester si 1 AA existait et si 2 AA existait auquel cas bingo j'affiche le A du col1
    si je teste avec la condition OU cela me sort bien le A une seule fois mais si je teste le ET cela ne renvoit rien.... logique me direz vous car le test se fait ligne par ligne et non dans la globalité du groupe créé.

    Alors comment faire? dois je faire : je cherche pour col1=A si il existe une ligne condition1 et une autre condition 2 et j'affiche donc le col1=A et, puis je teste le col2=B et ainsi de suite ou existe il une facon plus simple?

    D'avance merci car là je sèche.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,

    la direction du group by était une bonne idée.

    Pour votre cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select col1
    from ma_table
    where col2 in (1, 2) and col3 = 'AA'
    group by col1
    having count(distinct col2) = 2

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 62
    Par défaut
    merci pour la réponse si rapide, je teste la solution de ce pas :-)

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 62
    Par défaut
    c'est super cela fonctionne mais bien sur, en bon enquiquineur, ma requète finale est plus complexe.
    car j'ai besoin de faire 2 tests dans mon WHERE genre
    SELECT col1
    FROM ma_table
    WHERE ( (col2 IN (1, 2) AND col3 = 'AA') AND (col2 IN (4,5) AND col3='BB' ) )
    GROUP BY col1
    HAVING count(DISTINCT col2) = 2

    dans le cas ou dans le tableau il y aurait les lignes suivantes :
    col1 col2 col3
    ---------------------
    A | 1 | AA
    A | 2 | AA
    B | 1 | BB
    C | 3 | AA
    C | 2 | AA
    C | 1 | BB
    A | 4 | BB
    A | 5 | BB
    et là cela plante... je n'obtiens pas le résultat voulu car rien ne sort...

    question subsidiaire le IN correspond à un "OU" ou un "ET" ?

  5. #5
    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
    Salut,

    Idéalement, tu comptes tes occurences ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT col1
    FROM ma_table
    WHERE col2 IN (1, 2) AND col3 = 'AA'
    GROUP BY col1
    HAVING sum(case col2 when 1 then 1 end) >= 1
      AND sum(case col2 when 2 then 1 end) >= 1
    PS : Le IN est un "ou"

  6. #6
    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
    Par défaut
    Bonjour,

    Pour le IN, il s'agit bien d'un OR. La condition est vrai si la colonne testée est égale à l'une des valeurs du IN...

    mais... Normal que vous n'ayez pas de résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE (col2 IN (1, 2) AND col3 = 'AA') AND (col2 IN (4,5) AND col3='BB' )
    ce qui se traduit en français par :
    NE prendre que les lignes ou la col3 = 'AA' ET col3 = 'BB' ET col2 = 1 ou 2 ET col2 = 4 ou 5
    évidement, si col3 est égal à 'AA', il n'est pas égal à 'BB' ! aucune de vos lignes ne pourra donc vérifier votre filtre.

    Je pense qu'il vous faut un OR à la place du AND :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE (col2 IN (1, 2) AND col3 = 'AA') OR (col2 IN (4,5) AND col3='BB' )

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Ou comme ça si le SGBD utilisé le permet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select col1
      from t
     where (col2,col3) in ((1,'AA'),(2,'AA'),(4,'BB'),(5,'BB'))
     group by col1
    having count(distinct col2) = 4

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 62
    Par défaut
    je comprends mieux mais je n'y suit toujours pas

    Ce que je souhaiterai c'est écrire
    ne sortir que les valeurs de col1 (A ou b ou C) si les conditions
    col2= 1 ET col3=AA
    col2= 2 ET col3=AA
    col2= 4 ET col3=BB
    col2= 5 ET col3=BB
    sont vraies
    le souci est que le group by teste ligne par ligne et ne crée pas une espece de paquet qui reprend toutes les lignes du groupés et les teste les unes après les autres me disant seulement à la fin si c'est bon ou pas.

    Grrr plus je suis dessus moins j'ai de cheveux


    me reste plus qu'a faire une solution je teste chacune de mes conditions et j'ordonne par le col1 et si le col1 n'a pas changé lorsque toutes mes conditions ont été vérifiées je valide sinon je passe au suivant. mais bon ca va faire un truc barbare j'en ai peur

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

Discussions similaires

  1. Ajouter un groupe dans un autre groupe
    Par CedrX dans le forum Administration système
    Réponses: 0
    Dernier message: 10/01/2008, 12h20
  2. [CR 8.5] Ajouter un groupe parmi d'autres déjà créés
    Par ALINE85 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 02/10/2007, 16h18
  3. Réponses: 8
    Dernier message: 11/04/2007, 23h06
  4. "Group by" ou autre ?
    Par Orb Dorb dans le forum Langage SQL
    Réponses: 6
    Dernier message: 07/11/2006, 23h08
  5. Groupes de contacts et inclusion de groupe dans un autre
    Par WalidNat dans le forum Langage SQL
    Réponses: 6
    Dernier message: 18/05/2006, 20h44

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