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

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 62
    Points : 39
    Points
    39
    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 : 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,

    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

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

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

    Informations forums :
    Inscription : Janvier 2008
    Messages : 62
    Points : 39
    Points
    39
    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 émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    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
    Points : 13 092
    Points
    13 092
    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 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 62
    Points : 39
    Points
    39
    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

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    @skuatamad
    ca m'aurait bien plut mais hélas avec access 2000 cela ne semble pas possible
    car si j'ai bien compris avec ta soluce on teste les 4 conditions et si chacune est vérifiée alors c'est bon.
    Y'til moyen de traduire cela autrement?

  10. #10
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Et comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT col1
    FROM ma_table
    GROUP BY col1
    HAVING sum(case when col2 = 1 and  col3 = 'AA' then 1 end) >= 1
      AND sum(case when col2 = 2 and  col3 = 'AA' then 1 end) >= 1
      AND sum(case when col2 = 3 and  col3 = 'BB' then 1 end) >= 1
      AND sum(case when col2 = 4 and  col3 = 'BB' then 1 end) >= 1

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Access ne connait pas les CASE, il me semble qu'il faut utiliser IIF, le 1er CASE de la requête de pacmann réécrit en IIF devrait donner quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IIF(col2,1,IFF(col3,'AA',1,0),0)

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    arf là aussi ça plante en erreur la requête devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    stSQL = "SELECT col1 FROM matable GROUP BY col1"
    stSQL = stSQL & "HAVING sum(case when col2= 1 AND  type = 'AA' then 1 end) >= 1 "
    stSQL = stSQL & "AND sum(case when col2 = 2 AND  type = 'AA' then 1 end) >= 1 "
    stSQL = stSQL & "AND sum(case when col2 = 3 AND  type = 'BB then 1 end) >= 1 "'
    stSQL = stSQL & "AND sum(case when col2 = 4 AND  type = 'BB' then 1 end) >= 1 "
    mais ca répond :

    Erreur de compilation Microsoft VBScript error '800a0401'
    Fin d'instruction attendue
    /iisHelp/common/500-100.asp, line 11
    Dim objASPError, blnErrorWritten, strServername, strServerIP, strRemoteIP Dim strMethod, lngPos, datNow, strQueryString, strURL
    --------------------------------------------------------------------------^
    error '80004005'
    Erreur non spécifiée

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    arff je vous fait perdre du temps à vous tous.

    Je pense que je vais finalement me pencher vers un code pas joli genre je liste toutes mes conditions dans ma table pour la valeur1 de ma col1 puis pour la valeur 2 de ma col1 etc....
    et si j'ai 4 ok je garde la valeur sinon je continue, je vais créer un table qui reprendra toutes les valeurs de ma col1 en uniques comme ca pas de souci.

    Encore merci à tous et désolé d'avoir fait travaillé vos neurones sans vous donner la satisfaction du "youppeeee merci c'est mégasuperextracool "

  14. #14
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    T'as tenté le IIF de Skuat ? C'est le CASE version Access
    (Sinon tu peux aussi changer de SGBD, mais je pense que c'est moins simple )

  15. #15
    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
    ou, avec Access, un switch

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    euhh là je suis largué ca dépasse de loin mes compétences...
    j'ai testé mais cela ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stSQL = "SELECT col1 FROM matable GROUP BY col1 IIF(col2,1,IFF(type,"AA",1,0),0) AND IIF(col2,2,IFF(type,"AA",1,0),0) AND IIF(col2,4,IFF(type,"BB",1,0),0) AND IIF(col2,5,IFF(type,"BB",1,0),0) ;"
    erreur de syntaxe...

    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stSQL = "SELECT col1 FROM matable WHERE Switch (col2, 1, col3,"AA , col2, 2, col3, "AA", col2, 4, col3 "BB", col2, 5, col3, "BB") GROUP BY idsuivi ;"
    et la aussi ça plante avec comme message:
    Aucune valeur donnée pour un ou plusieurs des paramètres requis

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    j'aurai besoin d'aide car la solution semble bien du coté du IIF
    ma syntaxe est elle correcte ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    stSQL = "SELECT col1 FROM matable GROUP BY col1 "
    stSQL = stSQL & " IIF(col2,1,IFF(type,"AA",1,0),0) "
    stSQL = stSQL & "AND IIF(col2,2,IFF(type,"AA",1,0),0) "
    stSQL = stSQL & "AND IIF(col2,4,IFF(type,"BB",1,0),0) "
    stSQL = stSQL & "AND IIF(col2,5,IFF(type,"BB",1,0),0) ;"

  18. #18
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Comme tu le disais plus haut, il faut que tes contrôles portent sur le groupe.
    Pour cela, c'est la clause HAVING qui te permet d'y arriver.
    Le IIF permet de renvoyer 1 ou 0 pour une ligne donnée, il faut ensuite sommer ces 1 et 0 pour savoir si ton groupe contient où non une ligne matchant ta condition.

    Ca devrait donner quelque chose de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    stSQL = "SELECT col1 FROM matable GROUP BY col1 "
    stSQL = stSQL & " HAVING sum(IIF(col2,1,IFF(type,"AA",1,0),0)) >= 1"
    stSQL = stSQL & "AND sum(IIF(col2,2,IFF(type,"AA",1,0),0))>=1 "
    stSQL = stSQL & "AND sum(IIF(col2,4,IFF(type,"BB",1,0),0))>= 1 "
    stSQL = stSQL & "AND sum(IIF(col2,5,IFF(type,"BB",1,0),0))>=1 ;"

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    merci our ple coup de main finalement j'ai décidé de simplifier la base pour éviter des trucs trop compliqués ^^ mais je sèche encore avec cette condition HAVING avec IIF

    j'obtiens une requete
    SELECT col1 FROM matable GROUP BY col1 HAVING sum(IIF(col2,16,0)) >= 1 AND sum(IIF(col2,19,0)) >= 1 ORDER BY col1 ;
    le seul souci est que les résultats ne sont pas du tout ceux que j'attends car si j'ai bien compris là je devrais faire sortir les col1 qui remplissent ET col2=16 ET col2=19 (dans cet exemple) mais au lieu de cela tous les col1 sortent qu'ils répondent ou non à ces 2 conditions...

    Euh est ce normal docteur?
    33
    33
    33


    oui c'est normal en ASP le IIF n'est pas implémenté...


    j'ai rajouté cela mais encore là les résultats ne sont pas bons...

    Function IIf(i,j,k)
    If i Then IIf = j Else IIf = k
    End Function

    SELECT col1 FROM matable GROUP BY col1 HAVING sum(IIF(col2,16,0)) >= 1 AND sum(IIF(col2,19,0)) >= 1 ORDER BY col1 ;
    YESSSSS ca fonctionne voila le code pour ceux qui en aurait besoin

    function iif(boolEval, trueStr, falseStr)
    if boolEval then
    iif = trueStr
    else
    iif = falseStr
    end if
    end function

    SELECT col1 FROM matable GROUP BY col1 HAVING sum(IIF(col2=16,1,0)) >= 1 AND sum(IIF(col2=19,1,0)) >= 1 ORDER BY col1 ;

    Encore merci à tous pour votre pâtience et gentillesse !

+ 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