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 :

Sélection de la valeur d'un champ après aggrégation compliquée


Sujet :

Langage SQL

  1. #1
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Points : 909
    Points
    909
    Par défaut Sélection de la valeur d'un champ après aggrégation compliquée
    Bonjour,

    Etant dépendante d'un choix de codage fait dans une base j'ai un truc un peu tordu à faire:

    J'ai un objet qui apparait plusieurs fois avec des valeurs entières différentes pour le champs qui m'intéresse (de 1 à 9999 et de -1 a -4) je fais un group by et ne dois retenir qu'une seule valeur

    si pour une des entrées de l'objet le champ = 1 prendre 1
    sinon si un des champs est à 9999 prendre 9999
    sinon si au moins un des champs est positif prendre le minimum des valeurs positive
    sinon prendre le min des valeurs négatifs.

    EX:

    obj1 1
    obj1 -2
    obj1 3
    obj1 9999
    obj2 -2
    obj2 3
    obj2 9999
    obj3 -2
    obj3 3
    obj4 -2

    doit me donner:

    obj1 1
    obj2 9999
    obj3 3
    obj4 -2

    Je ne vois pas trop comment faire ça de manière non usine à gaz.
    Si quelqu'un a une piste je suis preneuse
    Informaticienne le jour, créatrice de bijoux la nuit (https://www.facebook.com/La-Fée-Chro...07539656306271) et maman à plein temps !

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Comme ça, ça a l'air de fonctionner pas mal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select obj, coalesce(min(case_1), min(case_2), min(case_3), min(case_4))
      from (select obj, c,
                   case when c = 1    then c end as case_1,
                   case when c = 9999 then c end as case_2,
                   case when c > 0    then c end as case_3,
                   case when c < 0    then c end as case_4
              from t
           ) temp
     group by obj
    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
    mysql> select obj, coalesce(min(case_1), min(case_2), min(case_3), min(case_4))
        ->   from (select obj, c,
        ->                case when c = 1    then c end as case_1,
        ->                case when c = 9999 then c end as case_2,
        ->                case when c > 0    then c end as case_3,
        ->                case when c < 0    then c end as case_4
        ->           from t
        ->        ) temp
        ->  group by obj;
    +------+--------------------------------------------------------------+
    | obj  | coalesce(min(case_1), min(case_2), min(case_3), min(case_4)) |
    +------+--------------------------------------------------------------+
    | obj1 |                                                            1 |
    | obj2 |                                                         9999 |
    | obj3 |                                                            3 |
    | obj4 |                                                           -2 |
    +------+--------------------------------------------------------------+
    4 rows in set (0.00 sec)
     
    mysql>

  3. #3
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Points : 909
    Points
    909
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Comme ça, ça a l'air de fonctionner pas mal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select obj, coalesce(min(case_1), min(case_2), min(case_3), min(case_4))
      from (select obj, c,
                   case when c = 1    then c end as case_1,
                   case when c = 9999 then c end as case_2,
                   case when c > 0    then c end as case_3,
                   case when c < 0    then c end as case_4
              from t
           ) temp
     group by obj
    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
    mysql> select obj, coalesce(min(case_1), min(case_2), min(case_3), min(case_4))
        ->   from (select obj, c,
        ->                case when c = 1    then c end as case_1,
        ->                case when c = 9999 then c end as case_2,
        ->                case when c > 0    then c end as case_3,
        ->                case when c < 0    then c end as case_4
        ->           from t
        ->        ) temp
        ->  group by obj;
    +------+--------------------------------------------------------------+
    | obj  | coalesce(min(case_1), min(case_2), min(case_3), min(case_4)) |
    +------+--------------------------------------------------------------+
    | obj1 |                                                            1 |
    | obj2 |                                                         9999 |
    | obj3 |                                                            3 |
    | obj4 |                                                           -2 |
    +------+--------------------------------------------------------------+
    4 rows in set (0.00 sec)
     
    mysql>
    Ok je test ! merci!

    il me manquait la fonction coalesce pour pouvoir trouver ça (je vais d'ailleurs de ce pas aller lire la doc dessus)
    Informaticienne le jour, créatrice de bijoux la nuit (https://www.facebook.com/La-Fée-Chro...07539656306271) et maman à plein temps !

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/08/2013, 19h19
  2. [MySQL] Conserver les valeurs d'un champs après EXIT()
    Par degio1er dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 20/02/2013, 10h56
  3. Récupérer la valeur d'un champ après recherche
    Par stefane26 dans le forum Requêtes et SQL.
    Réponses: 20
    Dernier message: 18/10/2011, 18h10
  4. Recuperer la valeur d'un champ d'aggrégation
    Par freud dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 03/08/2007, 21h03
  5. Récuperer la valeur d'un champ d'un formulaire après onblur
    Par kerido dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 13/09/2005, 15h58

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