Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/10/2011, 12h38   #1
Membre habitué
 
Inscription : novembre 2008
Messages : 238
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 238
Points : 120
Points : 120
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 :
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.
juju05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2011, 12h59   #2
Membre confirmé
 
Avatar de jkofr
 
Homme Jacques
Administrateur de base de données
Inscription : octobre 2006
Messages : 251
Détails du profil
Informations personnelles :
Nom : Homme Jacques
Âge : 43
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : octobre 2006
Messages : 251
Points : 219
Points : 219
Envoyer un message via MSN à jkofr
Hello,

Pouvez-vous mettre un petit jeux de test?

Jko
__________________
OCA-OCP 11g, SQL and Performance & Tuning Expert 11g
Data Guard 11g, ASM & Grid Control 11g, Apex
jkofr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2011, 13h27   #3
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Avec les fonctions analytiques, il y a quand même une sous-requête mais on ne rescanne pas la table :
Code :
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.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2011, 14h14   #4
Membre habitué
 
Inscription : novembre 2008
Messages : 238
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 238
Points : 120
Points : 120
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 :
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.
juju05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2011, 15h34   #5
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
Tu peux utiliser le keep :


Code :
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
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/10/2011, 16h39   #6
Membre habitué
 
Inscription : novembre 2008
Messages : 238
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 238
Points : 120
Points : 120
Je ne parviens pas à créer une vue sur la base de cette requête SQL:

Code :
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.
juju05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2011, 09h53   #7
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
Essayons d'investiguer : quelle est l'erreur relevée ?
Et la sous-requête tourne-t-elle seule ?
La sous-requête tourne correctement chez moi sur une 10g (10.2.0.4), avec un jeu de données simple.
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2011, 10h08   #8
Membre habitué
 
Inscription : novembre 2008
Messages : 238
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 238
Points : 120
Points : 120
Lorsque je passe cette requête sur la console de SQLDEVELOPPER je n'ai pas de problème.

Je souhaite créer une vue à partir de cette requête. Je vais sur la vue sur SQLDEVELOPPER puis clic-droit et je place la requête. Lorsque je clic sur test syntax j'ai cette erreur:

Citation:
Error(s) parsing SQL: Unexpected token at 219 near (dense_rank.
Unexpected token at 237 near order.
Invalid JOIN at 263 near AS.
Merci d'avance.
Julien.
juju05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2011, 11h01   #9
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
Je n'ai pas de SqlDevelopper sous la main, mais si tu fais bêtement dans une fenêtre SQL du "CREATE OR REPLACE VIEW ... AS ...", ça donne quoi ?
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2011, 11h27   #10
Membre habitué
 
Inscription : novembre 2008
Messages : 238
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 238
Points : 120
Points : 120
Merci bien, çà fonctionne.
juju05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h40.


 
 
 
 
Partenaires

Hébergement Web