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

Développement SQL Server Discussion :

Comment exclure un groupe de lignes si un élément en particulier est contenu dans ce groupe ?


Sujet :

Développement SQL Server

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut Comment exclure un groupe de lignes si un élément en particulier est contenu dans ce groupe ?
    Bonjour,
    Voici un extrait de ma table MyTable :
    Produit   / DetailType / Code
     Prod1    /     dt1      /  Cd1
     Prod1    /     dt1      /  Cd2
     Prod1    /     dt2      /  Cd1
     Prod1    /     dt2      /  Cd3
     Prod2    /     dt1      /  Cd1
     Prod2    /     dt1      /  Cd2
     Prod2    /     dt2      /  Cd1
     Prod2    /     dt2      /  Cd3
    Je cherche à obtenir la liste des couples Produit/DetailType qui ne contiennent pas le Code Cd3
    Je voudrais donc ici obtenir le résultat suivant :
    Produit   / DetailType
     Prod1    /     dt1
     Prod2    /     dt1
    Je pensais l'obtenir comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select Produit, DetailType
    from MyTable
    where Code != 'Cd3'
    group by Produit, DetailType
    Mais j'ai cela à la place :
    Produit   / DetailType
     Prod1    /     dt1
     Prod1    /     dt2
     Prod2    /     dt1
     Prod2    /     dt2
    Vous avez une idée de comment je devrais m'y prendre du coup s'il vous plaît ?
    Merci,

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

    vous pouvez faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select Produit, DetailType
    from MyTable
    group by Produit, DetailType
    HAVING MAX(CASE WHEN  Code = 'Cd3' THEN 'Cd3' END) IS NULL

  3. #3
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    Merci beaucoup !
    Je vois que ça marche aussi avec MIN à la place de MAX, pas AVG ou COUNT cependant.
    Quand on ne saisit pas de else, null est assumé, c'est ça ?
    C'est pour ça qu'il n'y a pas besoin d'écrire cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select Produit, DetailType
    from MyTable
    group by Produit, DetailType
    HAVING MAX(CASE WHEN  Code = 'Cd3' THEN 'Cd3' else null END) IS NULL

  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
    oui, MIN fonctionne aussi.
    En effet, par défaut le CASE renvoi NULL si aucune condition n'est vérifiée.

    AVG ne pourrait pas fonctionner, une moyenne de chaine de caractéres n'ayant pas de sens.

    Quant au COUNT, il pourrait fonctionner, mais de cette façon (COUNT ne compte pas les NULL) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HAVING COUNT(CASE WHEN  Code = 'Cd3' THEN 'Cd3' else null END) = 0
    Ce serait d'ailleurs peut-être un peu plus compréhensible, je pense qu'on comprend mieux la logique de la clause par rapport au besoin

    on peut aussi faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HAVING SUM(CASE WHEN  Code = 'Cd3' THEN 1 else 0 END) = 0

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

Discussions similaires

  1. [XL-2010] recherche du maximum dans un groupe de lignes
    Par diomedea dans le forum Excel
    Réponses: 2
    Dernier message: 11/04/2016, 11h29
  2. Comment vérifier si une variable est contenu dans un tableau ?
    Par larffas68 dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 05/01/2011, 23h17
  3. Réponses: 9
    Dernier message: 08/11/2010, 17h12
  4. Réponses: 18
    Dernier message: 03/06/2008, 15h18
  5. Réponses: 5
    Dernier message: 05/02/2007, 15h04

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