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

SQL Oracle Discussion :

Récupérer le nom du champ contenant la valeur max pour chaque enregistrement


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de H.ile
    Profil pro
    Architecte de système d'information
    Inscrit en
    Janvier 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Janvier 2008
    Messages : 122
    Par défaut Récupérer le nom du champ contenant la valeur max pour chaque enregistrement
    Aloha,

    J'ai du mal formulé ma recherche parce que je ne trouve aucune discussion portant sur cette question.

    Pour chacun de mes enregistrements, j'ai 10 champs de type nombre. J'aimerais par une requête, établir pour chaque enregistrement quel est le nom du champ contenant la valeur la plus haute :

    Si mon enregistrement est :
    ID|Att1|Att2
    A|10|20
    B|20|10
    Ma requête me renverra :
    ID|Max
    A|Att2
    B|Att1

    Cela vous semble-t'il possible, concevable et/ou faisable ?

    D'avance, merci,

  2. #2
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Tu devrais pouvoir arriver à tes fins avec les case :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT id,
    case 
       when Att1 > Att2 then 'Att1'
       when Att1 < Att2 then 'Att2'
       else 'idem'
    end as max
    FROM MaTable

  3. #3
    Membre confirmé Avatar de H.ile
    Profil pro
    Architecte de système d'information
    Inscrit en
    Janvier 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Janvier 2008
    Messages : 122
    Par défaut
    Effectivement, je n'y ai pas pensé.

    Mais si cela me semble adapté dans le cas d'un ou deux champs, la combinaison de 10 champs à comparer...

    Well : SELECT GREATEST(1,2) FROM DUAL renvoie 2 ! Yipi !

    Merci !

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Que cherches-tu ?
    La plus grande valeur ou le nom de la colonne qui contient cette plus grande valeur ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre confirmé Avatar de H.ile
    Profil pro
    Architecte de système d'information
    Inscrit en
    Janvier 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Janvier 2008
    Messages : 122
    Par défaut
    Je cherche le nom de la plus grande valeur.

    je vais donc faire quelque chose combinant les deux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT 
    CASE 
    WHEN Att1 = GREATEST(Att1, Att2, Att3,...) THEN 'Att1'
    WHEN Att2 = GREATEST(Att1, Att2, Att3,...) THEN 'Att2'
    ...
    END AS 'Mon attribut le plus grand'
    FROM 
    MA_TABLE
    Je pense que cela doit fonctionner.
    Je vous tiens au courant.
    Merci à tous

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Si tu as beaucoup d'opération de ce type à effectuer entre tes colonnes, c'est certainement que ta table a été mal modélisée.

    Si ta table respectait la 3ème forme normale, elle aurait la structure suivante : (ID, NomCol, Valeur) ce qui simplifierait nettement ton calcul.

    Le plus simple pour traiter ta demande serait de normaliser la table pour faire le traitement classique :
    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
    21
    22
    23
    24
    WITH    temp
        AS  (   SELECT  id      AS id
                    ,   'Att1'  AS nomcol
                    ,   Att1    AS valcol
                FROM    matable
            UNION
                ...
            UNION
                SELECT  id      AS id
                    ,   'AttN'  AS nomcol
                    ,   AttN    AS valcol
                FROM    matable   
            )
    SELECT  id
        ,   nomcol
        ,   valcol  -- pour info, mais ce n'est pas utile
    FROM    temp    tgt
    WHERE   EXISTS
            (   SELECT  1
                FROM    temp    src
                WHERE   src.id  = tgt.id
                GROUP BY src.id --  pas indispensable
                HAVING  MAX(src.valcol) = tgt.valcol
            )
    ----
    Edit :
    Avec GREATEST, tu peux légèrement simplifier la requête :
    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
    21
    22
    23
    24
    25
    26
    WITH    temp
        AS  (   SELECT  id      AS id
                    ,   'Att1'  AS nomcol
                    ,   Att1    AS valcol
                FROM    matable
            UNION
                ...
            UNION
                SELECT  id      AS id
                    ,   'AttN'  AS nomcol
                    ,   AttN    AS valcol
                FROM    matable   
            )
        ,   maxi
        AS  (   SELECT  id      AS id
                    ,   GREATEST(Att1, ..., AttN)    AS valmax
                FROM    matable
            )
    SELECT  id
        ,   nomcol
        ,   valcol  -- pour info, mais ce n'est pas utile
    FROM    temp
        INNER JOIN
            maxi
            ON  temp.id     = maxi.id
            AND temp.valcol = maxi.valmax
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

Discussions similaires

  1. [XL-2010] Afficher dans un tableau2 la Valeur MAX pour chaque colonne d'un tableau 1
    Par debutanteVba dans le forum Macros et VBA Excel
    Réponses: 24
    Dernier message: 30/10/2013, 15h28
  2. Recherche du nom d'un champs contenant une valeur donnée
    Par gliderman dans le forum Requêtes
    Réponses: 4
    Dernier message: 14/11/2011, 09h18
  3. [ODBC] Comment récupérer le nom des champs de table Access
    Par Alexlesilex dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 12/05/2006, 14h14
  4. Requête pour récupérer le nom des champs
    Par legillou dans le forum JDBC
    Réponses: 1
    Dernier message: 08/02/2006, 16h09
  5. récupérer le nom des champs d'une table d'une BDD-page web
    Par mathieu_r dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 09/06/2005, 14h02

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