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 :

Comparer le MAx de plusieurs Colonnes d'une Même Table


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 57
    Points : 27
    Points
    27
    Par défaut Comparer le MAx de plusieurs Colonnes d'une Même Table
    Bonjour à tous,

    Je souhaite comparer le Max de plusieurs colonnes d'une même Table en sélectionnant la valeur et SURTOUT le champ de la colonne la plus élevée.

    J'utilise pour cela Greatest mais elle me renvoie la valeur max certes mais sans le CHAMP. Voici la requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      SELECT ID, MAX(GREATEST(COALESCE( IDNT_FACT1 ,  IDNT_FACT2 , IDNT_FACT3,  IDNT_FACT4)))
     
    FROM MATABLE
    Avec IDNT_FACT1 = 5 IDNT_FACT2=4 IDNT_FACT3 =9 IDNT_FACT4 = 1

    Le résultat m'affiche ID, 9 et moi je souhaite qu'il affiche aussi le champ, en l'occurence le champ IDNT_FACT3. Soit ID, IDNT_FACT(9)

    Merci pour votre aide

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 790
    Points
    30 790
    Par défaut
    Avanta d'aller plus loin :
    La fonction COALESCE() retourne la première valeur non nulle de la liste de ses paramètres.
    Appliquer la fonction GREATEST sur ce résultat n'a pas de sens, puisqu'il n'y aura qu'une valeur dan les paramètres de cette dernière.
    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.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 57
    Points : 27
    Points
    27
    Par défaut
    Bonjour al1_24 ,

    Tu as sans doute raison et c'est ce qui explique que je n'ai qu'un seul résultat et qui n'est autre que la première valeur non nulle.
    Le Greatest simple me donne que des valeurs nulles.Envisager un Case serait bcp trop long il me semble, que me proposes tu alors?

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    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 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Pour information GREATEST n'existe pas comme fonction du langage SQL….

    A +
    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/ * * * * *

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 57
    Points : 27
    Points
    27
    Par défaut
    Comment ça n'existe pas comme fonction de langage SQL? Je comprends pas.?

    Voici le resultat d'un GREATEST que je viens de lancer en PJ et cela marche . Mon souci c'est comment afficher le champ du meilleur résultat.
    Fichiers attachés Fichiers attachés

  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,

    votre problème est complexe, car votre base est mal modélisée.

    si vous aviez quatre lignes au lieu de quatre colonnes, se serait beaucoup plus simple, et probablement bien plus performant.

    avez vous la possibilité de modifier le modèle ?

    Sinon, il faudra le faire dans la requête, ça restera plus simple/lisible que des CASE imbriqués.

    Quel est votre SGBDR ?

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 57
    Points : 27
    Points
    27
    Par défaut
    Mon SGBDR est TERADATA OU SAS

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 790
    Points
    30 790
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Pour information GREATEST n'existe pas comme fonction du langage SQL….
    Citation Envoyé par ibdiak Voir le message
    Comment ça n'existe pas comme fonction de langage SQL? Je comprends pas.?
    Ce que dit avec justesse SQLpro, c'est que la fonction GREATEST n'est pas définie dans la norme officielle du langage SQL.
    C'est pourquoi il est recommandé de préciser quel SGBD on utilise lorsqu'on poste une question dans le forum Langae SQL.

    Limiter ses développements à l'usage exclusif des commandes et fonctions normalisées permet une portabilité accrue des applications.
    Certains éditeurs de SGBD ajoutent des commandes et fonctions hors norme soit pour apporter des fonctionnalités supplémentaires, soit pour permettre une meilleure portabilité des applications conçues pour un autre SGBD. (C'est d'ailleurs le cas pour la fonction GREATEST, ajoutée par Teradata à la grammaire de son SGBD pour agrémenter ses clients en simplifiant la reprise de requêtes développées pour Oracle )
    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.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 57
    Points : 27
    Points
    27
    Par défaut
    Merci pour ces précisions, du coup y'a t'il une solution à mon problème?

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 13
    Points : 29
    Points
    29
    Par défaut
    Bonjour,


    Avec des CASE ont s'en tire très bien

    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
     
    SELECT ID
    	, CASE
    		WHEN IDNT_FACT1 >= IDNT_FACT2 AND IDNT_FACT1 >= IDNT_FACT3 AND IDNT_FACT1 >= IDNT_FACT4 THEN 'IDNT_FACT1'
    		WHEN IDNT_FACT2 >= IDNT_FACT3 AND IDNT_FACT2 >= IDNT_FACT4 THEN 'IDNT_FACT2'
    		WHEN IDNT_FACT3 >= IDNT_FACT4 THEN 'IDNT_FACT3'
    		ELSE 'IDNT_FACT4'
    	END AS NOM_COL
    	, CASE
    		WHEN IDNT_FACT1 >= IDNT_FACT2 AND IDNT_FACT1 >= IDNT_FACT3 AND IDNT_FACT1 >= IDNT_FACT4 THEN IDNT_FACT1
    		WHEN IDNT_FACT2 >= IDNT_FACT3 AND IDNT_FACT2 >= IDNT_FACT4 THEN IDNT_FACT2
    		WHEN IDNT_FACT3 >= IDNT_FACT4 THEN IDNT_FACT3
    		ELSE IDNT_FACT4
    	END AS VAL_COL
    FROM MATABLE
    A+

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 57
    Points : 27
    Points
    27
    Par défaut
    Bonjour !

    En effet, ça marche très bien avec des CASE!

    Merci à tous !

    A+

  12. #12
    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
    A condition de n'avoir aucun NULL !

  13. #13
    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
    Oui, pas de soucis avec les CASE mais si vous voulez gérer les nulls, ça peut commencer à faire un peu longuet.
    La solution à base de UNPIVOT est assez efficace :
    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
    create multiset volatile table mvt_matable, no log
    ( ID            integer
    , IDNT_FACT1    integer
    , IDNT_FACT2    integer
    , IDNT_FACT3    integer
    , IDNT_FACT4    integer
    )
    primary index (ID)
    on commit preserve rows;
     
    insert into mvt_matable (ID, IDNT_FACT1, IDNT_FACT2, IDNT_FACT3, IDNT_FACT4) values (1, 5, 4, 9   , 1);
    insert into mvt_matable (ID, IDNT_FACT1, IDNT_FACT2, IDNT_FACT3, IDNT_FACT4) values (2, 5, 4, null, 1);
     
      select ID, IDNT_FACT_COL, IDNT_FACT_VAL
        from TD_UNPIVOT( on (select ID, IDNT_FACT1, IDNT_FACT2, IDNT_FACT3, IDNT_FACT4
                               from mvt_matable)
                              using VALUE_COLUMNS ('IDNT_FACT_VAL')
                                    UNPIVOT_COLUMN('IDNT_FACT_COL')
                                    COLUMN_LIST   ('IDNT_FACT1', 'IDNT_FACT2', 'IDNT_FACT3', 'IDNT_FACT4')
                       ) as X
     qualify row_number() over(partition by ID order by IDNT_FACT_VAL desc) = 1;
     
    ID  IDNT_FACT_COL  IDNT_FACT_VAL
    --  -------------  -------------
     1  IDNT_FACT3                 9
     2  IDNT_FACT1                 5

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

Discussions similaires

  1. Max pour plusieurs éléments dans une même table
    Par Schwy dans le forum Requêtes
    Réponses: 12
    Dernier message: 07/10/2013, 17h17
  2. Réponses: 1
    Dernier message: 24/02/2011, 19h11
  3. faire l'union de plusieurs colonnes d'une même table
    Par knadege dans le forum Langage SQL
    Réponses: 13
    Dernier message: 15/04/2010, 15h08
  4. Réponses: 3
    Dernier message: 14/06/2009, 00h14
  5. Count dans plusieurs colonne d'une même table
    Par macfleid dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/07/2008, 20h43

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