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 :

Extraction des dernières lignes de commande d'achat par article


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 618
    Par défaut Extraction des dernières lignes de commande d'achat par article
    Bonjour,

    Je cherche à extraire les dernières lignes de commande d'achat par article à partir des bons de réception d'achat.

    Je cherche donc le dernier bon de réception par article de la sorte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select a.id_article, max(a.date_livre) as date_livre_max
        from t_achat_bl_ligne a    
        where a.date_livre < TO_DATE('30/09/2011','DD/MM/YYYY')
        group by a.id_article
    Je souhaiterai que ma requête me remonte également le n° de ligne de commande d'achat contenue dans t_achat_bl_ligne.

    Comment faire si ce n'est en plaçant cette requête en sous-requête ?

    Je suis sous Oracle 10g.

    Merci d'avance.
    Julien.

  2. #2
    Membre émérite Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Par défaut
    Hello,

    Pouvez-vous mettre un petit jeux de test?

    Jko

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Avec les fonctions analytiques, il y a quand même une sous-requête mais on ne rescanne pas la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select num_ligne_commande, id_article, date_livre
      from (SELECT a.num_ligne_commande, a.id_article, a.date_livre,
                   row_number() over (partition by a.id_article order by a.date_livre DESC) AS rn
              FROM t_achat_bl_ligne a    
             WHERE a.date_livre < TO_DATE('30/09/2011','DD/MM/YYYY'))
     where rn = 1
    S'il peut y avoir des dates identiques par id_article alors utiliser dense_rank.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 618
    Par défaut
    Le problème est effectivement qu'il peut y avoir 2 fois la même date sur la réception. C'est pour cela que je ne souhaite que conserver la ligne de réception poitant sur la comman,de la plus récente. Pour cela, je pense que conserver l'id_bl_achat_ligne le plus élevé est suffisamment discriminant.
    Voici ma requête qui me permet d'extraire les informations mais qui me remonte les 2 lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select a.id_article, a.date_livre, a.id_achat_bl_ligne
    from toperp.t_achat_bl_ligne a  
    inner join
    (select a.id_article, max(a.date_livre) as date_livre_max
    from toperp.t_achat_bl_ligne a    
    where a.date_livre < TO_DATE('30/09/2011','DD/MM/YYYY')
    group by a.id_article) tmp 
    on a.id_article = tmp.id_article
    and a.date_livre = tmp.date_livre_max
    order by 1
    Un jeu d'essai:
    2 lignes pour le couple ID_ARTICLE/DATE_LIVRE
    ID_article = 6172
    a.date_livre = 25/09/08
    a.id_achat_bl_ligne = 21032 et 21042.

    Merci.
    Julien.

  5. #5
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Tu peux utiliser le keep :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT  a.id_article
           ,max(a.date_livre) AS date_livre_max
           ,max(a.no_ligne_commande) keep (dense_rank first order by date_livre DESC, id_achat_bl_ligne DESC) AS no_ligne_commande_max
      FROM t_achat_bl_ligne a    
     WHERE a.date_livre < TO_DATE('30/09/2011','DD/MM/YYYY')
     GROUP BY a.id_article

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 618
    Par défaut
    Je ne parviens pas à créer une vue sur la base de cette requête SQL:

    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
    select r.id_article,al.id_achat_ligne, r.reference, tmp.date_livre, ach.num_achat
    from toperp.t_achat_ligne al
    inner join 
    (
    SELECT  a.id_article
          ,max(a.date_livre) AS date_livre
          ,max(a.id_achat_ligne) keep (dense_rank first order by date_livre DESC) AS id_achat_ligne
     FROM t_achat_bl_ligne a    
    WHERE a.date_livre < TO_DATE('30/09/2011','DD/MM/YYYY')
    GROUP BY a.id_article
    ) tmp
     
    on tmp. id_achat_ligne  = al.id_achat_ligne
    inner join toperp.t_article r
     on r.id_article = al.id_article
    inner join toperp.t_achat ach
    on al.id_achat = ach.id_achat
    J'ai une erreur à proximité du "dense" et du "AS".

    Merci d'avance.
    Julien.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/10/2014, 01h13
  2. probleme extraction des entetes lignes et colonnes
    Par lps02 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/05/2012, 11h56
  3. [MySQL] sélection des dernières lignes avec affichage aléatoire
    Par nabmoah dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 08/08/2008, 23h57
  4. Connaitre la ligne de commande Java générée par Eclipse
    Par webspeak dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 16/08/2007, 12h05
  5. [MySQL] Sélection des dernières lignes d'une table
    Par Civet dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 25/04/2007, 15h06

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