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 :

Condition MAX sur SELECT


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2019
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2019
    Messages : 29
    Par défaut Condition MAX sur SELECT
    Bonjour à tous !

    Sur la table suivante, je cherche à faire en sorte que mon SELECT ne prenne en compte que les valeurs MAX du champ N_AVENANT :

    Nom : Sans titre.jpg
Affichages : 158
Taille : 126,1 Ko

    Mon code est le suivant :

    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
    27
    28
    SELECT DISTINCT
     
     OFS.ID_OFS as NUMERO_OF,
     S_CMD.DATE_CMD as DATE_CDE,
     S_CMD.ID_S_CMD as N_COMMANDE,
     S_CMD.ID_ANNEE as ANNEE,
     S_CMD.N_AVENANT as N_AVENANT,
     S_CMD_LG.N_LIGNE as LIGNE,
     FOURN_ST.NOM as FOURNISSEUR,
     ARTICLE.REF as ARTICLE,
     ARTICLE.LIBELLE as DESIGNATION,
     S_CMD_LG.QTE_CMDEE as QTE_CMDEE,
     S_BL.N_BL as BL_ST,
     S_BL_LG.QTE_LIVREE as QTE_BL_ST
     
      FROM S_CMD 
     
     INNER JOIN S_CMD_LG ON S_CMD.CD_S_CMD = S_CMD_LG.CD_S_CMD
     INNER JOIN FOURN_ST ON FOURN_ST.CD_FOURN_ST = S_CMD.CD_FOURN_ST 
     INNER JOIN OFS ON OFS.CD_OFS = S_CMD_LG.CD_OFS
     INNER JOIN ARTICLE ON ARTICLE.CD_ARTICLE = OFS.CD_ARTICLE
     FULL JOIN S_BL_LG ON S_CMD_LG.CD_S_CMD = S_BL_LG.CD_S_CMD AND S_CMD_LG.N_LIGNE = S_BL_LG.N_LIGNE
     FULL JOIN S_BL ON S_BL_LG.CD_S_BL = S_BL.CD_S_BL
     
     WHERE S_CMD_LG.QTE_CMDEE <> 0
     AND S_CMD.DATE_CMD > add_months(sysdate, -24)
     
    ORDER BY S_CMD.DATE_CMD asc
    C'est donc garder les MAXI de S_CMD.N_AVENANT qui m'intéresse. Je ne maitrise pas l'utilisation de la fonction MAX, auriez-vous une solution ?

    Cordialement,

    Marin SIMONS

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 528
    Par défaut
    Bonjour,
    Est-ce que le MAX en question doit tenir compte des jointures, ou est-ce que tu veux le max "absolu", donc dans toutes les lignes de la table ?
    Si c'est le dernier cas, tu peux par exemple utiliser une sous-requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select ...
    from table1 as t1
    inner join ...
    where t1.col = max(select t1 from table1)
    Tatayo.

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    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 142
    Par défaut
    Je ne maitrise pas l'utilisation de la fonction MAX
    Le principe est simple : il faut regrouper (GROUP BY) sur toutes les colonnes qui ne font pas l'objet d'une fonction d'agrégation (ici MAX()).
    Mais le besoin est-il bien le suivant ?
    C'est donc garder les MAXI de S_CMD.N_AVENANT qui m'intéresse
    Ou bien : ne conserver que les lignes correspondant au plus grand S_CMD.N_AVENANT ?
    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.

  4. #4
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2019
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2019
    Messages : 29
    Par défaut
    Bonjour,

    Exemple de ce que je veux garder :

    Nom : Sans titre.jpg
Affichages : 136
Taille : 58,3 Ko

    Sur l'OF 22254, il y a une commande 2607 année 2018 poste 1. Elle est en double car il y a eu un avenant de fait (colonne L). Je souhaite afficher uniquement la ligne avec l'avenant maximum.

    Autre exemple sur un OF n° 19037 :

    Nom : 2.jpg
Affichages : 163
Taille : 106,9 Ko

    Je ne souhaite afficher que la ligne 7227.

    Cordialement,

    Marin SIMONS

  5. #5
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2019
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2019
    Messages : 29
    Par défaut
    Bonjour à tous,

    Le code suivant fonctionne :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    WITH 
       DER_CMD (N_AVENANT, ID_S_CMD, ID_ANNEE)
       AS 
         (SELECT MAX(N_AVENANT), ID_S_CMD, ID_ANNEE
          FROM   S_CMD
          GROUP  BY ID_S_CMD, ID_ANNEE)
     
    SELECT DISTINCT
     
     OFS.ID_OFS as NUMERO_OF,
     S_CMD.DATE_CMD as DATE_CDE,
     S_CMD.ID_S_CMD as N_COMMANDE,
     S_CMD.ID_ANNEE as ANNEE,
     S_CMD_LG.N_LIGNE as LIGNE,
     FOURN_ST.NOM as FOURNISSEUR,
     ARTICLE.REF as ARTICLE,
     ARTICLE.LIBELLE as DESIGNATION,
     S_CMD_LG.QTE_CMDEE as QTE_CMDEE,
     S_BL.N_BL as BL_ST,
     MAX(S_CMD.N_AVENANT) as N_AVENANT,
     S_BL_LG.QTE_LIVREE as QTE_BL_ST
     
      FROM S_CMD 
     
     INNER JOIN DER_CMD ON S_CMD.ID_S_CMD = DER_CMD.ID_S_CMD AND S_CMD.ID_ANNEE = DER_CMD.ID_ANNEE AND S_CMD.N_AVENANT = DER_CMD.N_AVENANT
     INNER JOIN S_CMD_LG ON S_CMD.CD_S_CMD = S_CMD_LG.CD_S_CMD
     INNER JOIN FOURN_ST ON FOURN_ST.CD_FOURN_ST = S_CMD.CD_FOURN_ST 
     INNER JOIN OFS ON OFS.CD_OFS = S_CMD_LG.CD_OFS
     INNER JOIN ARTICLE ON ARTICLE.CD_ARTICLE = OFS.CD_ARTICLE
     FULL JOIN S_BL_LG ON S_CMD_LG.CD_S_CMD = S_BL_LG.CD_S_CMD AND S_CMD_LG.N_LIGNE = S_BL_LG.N_LIGNE
     FULL JOIN S_BL ON S_BL_LG.CD_S_BL = S_BL.CD_S_BL
     
     WHERE S_CMD_LG.QTE_CMDEE <> 0
     AND S_CMD.DATE_CMD > add_months(sysdate, -100)
     
    GROUP BY S_BL_LG.QTE_LIVREE, S_BL.N_BL, S_CMD_LG.QTE_CMDEE, ARTICLE.LIBELLE, ARTICLE.REF, FOURN_ST.NOM, S_CMD_LG.N_LIGNE, S_CMD.ID_ANNEE, S_CMD.ID_S_CMD, S_CMD.DATE_CMD, OFS.ID_OFS
    ORDER BY S_CMD.DATE_CMD asc
    Est-il optimisé ?

    Cordialement,

    Marin SIMONS

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

Discussions similaires

  1. Condition php sur le champs select
    Par lunick dans le forum Langage
    Réponses: 7
    Dernier message: 18/09/2009, 10h18
  2. Select avec "having max" sur chp date
    Par Adel_mana dans le forum Langage SQL
    Réponses: 5
    Dernier message: 14/08/2009, 12h01
  3. [MySQL] SELECT MAX() sur 2 champs
    Par patguits dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/09/2007, 14h03
  4. select max sur champ alphanumérique ?
    Par clawhammer dans le forum SQL
    Réponses: 3
    Dernier message: 16/10/2006, 15h00
  5. [Oracle] Plusieurs select max() sur plusieurs tables
    Par Xavier2701 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/06/2006, 17h36

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