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 :

Remonter la bonne valeur dans une sous requête


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Cadre
    Inscrit en
    Septembre 2013
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Cadre
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 83
    Par défaut Remonter la bonne valeur dans une sous requête
    Bonjour,
    dans le code suivant, j'ai rajouté le 3ème champ, lorsque l'exécute le code, j'ai 4 lignes qui remontent (normal puisque dans la table il y 4 lignes) mais une seule valeur du 3ème champ est la bonne celle qui correspond à la date max.
    J'ai dupliqué la table avec une jointure, j'ai créé une sous-requête dans le FROM sans résultat. Quelle est la bonne méthode s'il vous plait?

    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
     
    SELECT     e.id_article
    ,          MAX(e.date_cmde)
    ,          tal2.qte_cmde
    FROM
      (
       SELECT   ta.id_article 
               ,tal.reference     
               ,date_cmde
               ,tal.ID_ACHAT_LIGNE
       FROM     TOPERP.T_achat_LIGNE tal 
               ,TOPERP.T_article ta
               ,T_GROUPE_ARTICLE tga
       WHERE    tal.ID_ARTICLE =  ta.ID_ARTICLE (+)
       and      ta.ID_GROUPE_ARTICLE = tga.ID_GROUPE_ARTICLE(+)
       and      tga.ID_GROUPE_ARTICLE = 77
       GROUP BY tal.reference
               ,date_cmde 
               ,ta.id_article 
               ,tal.ID_ACHAT_LIGNE
      ) e
    ,  toperp.t_achat_ligne tal2
    WHERE       e.id_article = 6800
    and         e.ID_ACHAT_LIGNE = tal2.ID_ACHAT_LIGNE
    GROUP BY    e.id_article
    ,           tal2.qte_cmde
    ;

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

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 442
    Par défaut
    Bonjour,
    Telle qu'elle est écrite, ta requête renvoie la valeur max de la colonne e.date_cmde pour chaque couple de valeur e.id_article, tal2.qte_cmde.
    Il est donc normal que la valeur de la troisième colonne du résultat corresponde à celle de la date max.

    Du coup j'ai du mal à cerner le problème.

    Est-ce que tu peux nous donner un jeu de test et le résultat attendu ?

    Tatayo.

  3. #3
    Membre confirmé
    Homme Profil pro
    Cadre
    Inscrit en
    Septembre 2013
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Cadre
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 83
    Par défaut
    Bonjour Tatayo,
    voila ce que j'obtiens:

    id_article date_max Qte
    6800 13/03/17 102
    6800 07/01/19 72
    6800 30/09/18 58
    6800 11/09/17 55

    voila ce que je voudrais obtenir:

    6800 07/01/19 72

    voilà ce que j'obtiens sans le troisième champ et qui est conforme:

    6800 07/01/19

  4. #4
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Je pense que la phrase importante est :
    mais une seule valeur du 3ème champ est la bonne celle qui correspond à la date max.
    Donc tu veux pour chaque Article, la date dernière commande et la qte dans cette commande, ce qui se fait par une sous-requête renvoyant l'id de la dernière commande ou par des fonctions analytiques (fonctions de fenêtrages)
    De plus il y a des jointures externes qui ne servent à rien car il y a une restriction sur le groupe_article = 77

    Exemple avec sous-requête (sous réserve qu'il ne peut y avoir qu'une seule ligne par date_cmde pour un article
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT  ta.id_article, date_cmde, tal.qte_cmde
    FROM TOPERP.T_achat_LIGNE tal, TOPERP.T_article ta, T_GROUPE_ARTICLE tga
    WHERE ta.id_article = tal.id_article
    AND tga.id_groupe_article = ta.id_groupe_article
    AND tga.id_groupe_article = 77
    AND tal.id_article = 6800
    AND tal.date_cmde = (SELECT MAX(tal2.date_cmde) FROM TOPERP.T_achat_LIGNE tal2 where tal2.id_article = tal.id_article)
    Sinon avec les fonctions analytiques, quelque chose dans le genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT  ta.id_article, MAX(date_cmde) KEEP (DENSE_RANK FIRST ORDER BY date_cmde desc) date_cmde, MAX(tal.qte_cmde) KEEP (DENSE_RANK FIRST ORDER BY date_cmde desc) qte
    FROM TOPERP.T_achat_LIGNE tal, TOPERP.T_article ta, T_GROUPE_ARTICLE tga
    WHERE ta.id_article = tal.id_article
    AND tga.id_groupe_article = ta.id_groupe_article
    AND tga.id_groupe_article = 77
    AND tal.id_article = 6800
    group by ta.id_article

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par McM Voir le message
    Sinon avec les fonctions analytiques, quelque chose dans le genre
    Je pinaille, mais FIRST et LAST sont des fonctions qui existent sous les formes agrégat et analytique, mais dans le code fourni c'est leur première forme qui est employée.

    Le DENSE_RANK est trompeur, mais c'est la présence (ou non) du OVER() qui indique s'il s'agit de la forme analytique de la fonction.

  6. #6
    Membre confirmé
    Homme Profil pro
    Cadre
    Inscrit en
    Septembre 2013
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Cadre
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2013
    Messages : 83
    Par défaut
    Merci à tous.

    Les 2 propositions sont valides.

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

Discussions similaires

  1. Utilisation de valeur dans une sous-requête
    Par wd_newbie dans le forum Langage SQL
    Réponses: 8
    Dernier message: 08/01/2022, 21h32
  2. Transfert de valeur dans une sous-requête
    Par Guillaume418 dans le forum Access
    Réponses: 3
    Dernier message: 23/11/2020, 17h55
  3. [MySQL-5.7] LIMIT dans une sous requête LEFT JOIN : la valeur n'est pas rendue
    Par ddaweb dans le forum Requêtes
    Réponses: 3
    Dernier message: 07/11/2017, 09h54
  4. Utiliser une liste de valeurs dans une sous-requête
    Par sagopa dans le forum Requêtes
    Réponses: 12
    Dernier message: 30/04/2012, 11h08
  5. Ramener plusieurs champs dans une sous requête...
    Par David.V dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 12/01/2005, 07h54

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