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 :

Requete SQL avec GROUP BY et HAVING


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 10
    Points : 9
    Points
    9
    Par défaut Requete SQL avec GROUP BY et HAVING
    J'ai une table (dont je ne peux pas modifier le schéma) du type :

    TYPE | VALEUR
    ---------------
    A | V1
    A | V2
    B | V1
    C | V1
    C | V2
    C | V3
    D | V2
    D | V3

    Je voudrais avoir les Type qui ont une valeur V1 ET V2 : Ici dans mon cas A et C donc

    J'ai essayé avec quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Type 
    FROM maTable 
    GROUP BY TYPE 
    HAVING VALEUR = V1 AND VALEUR = V2
    Mais cela ne marche pas
    J'utilise mal la clause having, je devrais en utiliser une autre ??? Je suis dans le flou ....

  2. #2
    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 de filtrer depuis votre table les lignes qui sont soit V1 soit V2, puis de compter pour chaque type ceux qui ont exactement deux lignes.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    les clauses GROUP BY et HAVING ne s'utilisent qu'en présence d'agrégats comme SUM, MAX, MIN, COUNT, AVG...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE MaTable
    (COL_TYPE CHAR(1),
     COL_VALEUR CHAR(2))
     
    INSERT INTO MaTable VALUES ('A', 'V1')
    INSERT INTO MaTable VALUES ('A', 'V2')
    INSERT INTO MaTable VALUES ('B', 'V1')
    INSERT INTO MaTable VALUES ('C', 'V1')
    INSERT INTO MaTable VALUES ('C', 'V2')
    INSERT INTO MaTable VALUES ('C', 'V3')
    INSERT INTO MaTable VALUES ('D', 'V2')
    INSERT INTO MaTable VALUES ('D', 'V3')
    Solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT COL_TYPE
    FROM   MaTable AS T1
    WHERE  COL_VALEUR = 'V1'
      AND  EXISTS(SELECT *
                  FROM   MaTable AS T2
                  WHERE  COL_VALEUR = 'V2'
                    AND  T1.COL_TYPE = T2.COL_TYPE)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    COL_TYPE
    --------
    A
    C
    Et pour un cous sur SQL, mon livre, comme mon site web peuvent vous aider !
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    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
    Je préfère la solution sur laquelle je le dirigeais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      SELECT COL_TYPE
        FROM @MaTable
       WHERE COL_VALEUR IN ('V1', 'V2')
    GROUP BY COL_TYPE
      HAVING COUNT(DISTINCT COL_VALEUR) = 2;
     
    COL_TYPE
    --------
    A
    C

  5. #5
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Je préfère la solution sur laquelle je le dirigeais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      SELECT COL_TYPE
        FROM @MaTable
       WHERE COL_VALEUR IN ('V1', 'V2')
    GROUP BY COL_TYPE
      HAVING COUNT(DISTINCT COL_VALEUR) = 2;
     
    COL_TYPE
    --------
    A
    C
    Bonjour,

    Je suppose que cette solution a été testée sous MySQL...
    Le mot-clef GROUP BY n'a aucune raison d'être s'il n'y a pas de fonction d'aggrégat...

    Arkhena
    A bove ante, ab asino retro, a stulto undique caveto

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour Arkena,
    Le mot-clef GROUP BY n'a aucune raison d'être s'il n'y a pas de fonction d'aggrégat...
    A moins que j'ai la berlue il y a un agrégat dans le having
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HAVING COUNT(DISTINCT COL_VALEUR) = 2;
    Et c'est bien ce qu'annoncait Waldar il compte le nombre de résultat pour savoir s'il y en a bien 2
    A+
    Soazig

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Merci à tous pour vos réponses :
    j'ai testé une solution du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Type 
    FROM (SELECT Type, (Valeur='V1') AS C1, (Valeur='V2') AS C2 
    FROM maTable) AS tableFiltree 
    GROUP BY Type 
    HAVING SUM(C1)=1 AND SUM(C2)=1
    Elle marche, mais vos solutions sont plus propres et je vous en remercie.

    Je vais surement utiliser une comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT COL_TYPE
        FROM @MaTable
       WHERE COL_VALEUR IN ('V1', 'V2')
    GROUP BY COL_TYPE
      HAVING COUNT(DISTINCT COL_VALEUR) = 2;
    Je la teste demain et je vous tiens au courant ... mais pour mon problème ma solution marche même si elle n'est peut-être pas la plus efficace.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Je confirme vos exemples fonctionnent.

    Merci à tous pour cette résolution rapide du problème.

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

Discussions similaires

  1. Manipulation d'un requete SQL avec GROUP BY
    Par Mike91 dans le forum MySQL
    Réponses: 6
    Dernier message: 03/04/2015, 09h33
  2. REQUETE SQL AVEC HAVING
    Par juju_77 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 05/08/2005, 09h49
  3. Probleme de requete SQL avec un champs date
    Par ju360modena dans le forum ASP
    Réponses: 5
    Dernier message: 16/06/2005, 11h18
  4. [JDBC] retour de requete sql avec valeur NULL
    Par maxxou dans le forum JDBC
    Réponses: 3
    Dernier message: 13/09/2004, 14h40

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