Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 25/10/2011, 16h21   #1
Invité de passage
 
Responsable de service informatique
Inscription : septembre 2006
Messages : 6
Détails du profil
Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Industrie

Informations forums :
Inscription : septembre 2006
Messages : 6
Points : 2
Points : 2
Par défaut Sous-requête ou pas ?

Bonjour à tous, voici mon probleme:
Je voudrai faire une requete sur une table contenant le détail des lignes de commandes. Dans cette table que nous appellerons T1 je voudrai récupérer la date et le numéro de la derniére commande pour chaque article.

Table T1:
NumCde         NumArticle      Date
1              A1              01/01/2001
1              A2              01/01/2001
1              A3              01/01/2001
1                              01/01/2001
2              A1              01/02/2001
2              A5              01/02/2001
2              A6              01/02/2001
3              A2              01/03/2001
3              A4              01/03/2001
3              A5              01/03/2001
Requête :
Code :
1
2
3
4
  SELECT T1.NumArticle, Max(T1.Date)
    FROM T1
   WHERE T1.NumArticle IS NOT NULL
GROUP BY T1.NumArticle
Le résultat donne la derniére date de commande connue pour chaque article mais il me faudrait aussi le numéro de commande, et là je séche je ne sais pas comment faire pour structurer une requète SQL correcte qui me donnerai un résultat du genre :
Article          N° Cde            Date
A1               2                 01/02/2001
A2               3                 01/03/2001
A3               1                 01/01/2001
A4               3                 01/03/2001
A5               3                 01/03/2001
A6               2                 01/02/2001
Si quelqu'un peut m'aider je le remercie d'avance.
CHRISTOPHE_86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 16h29   #2
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
Bonjour,

Code :
1
2
3
4
5
6
7
 
SELECT NumCde, NumArticle, Date
FROM TABLE T1
WHERE T.Date = (SELECT MAX(T2.DATE)
                         FROM TABLE t2
                         WHERE t1.numarticle = t2.numarcticle)
;
__________________
Cordialement.
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 16h30   #3
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 097
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 097
Points : 1 914
Points : 1 914
Bonjour,
Tu peux le faire avec une jointure externe:
Code SQL :
1
2
3
4
5
6
 
SELECT t1.numcde,T1.NumArticle, T1.Date
FROM T1
LEFT OUTER JOIN t1 AS t2 ON t2.numarticle = t1.numarticle AND t2.date >= t1.date AND t2.numcde > t1.numcde
WHERE T1.NumArticle IS NOT NULL
AND t2.numcde IS NULL

J'ai pris pour hypothèse que le numéro de commande s'incrémente dans le temps...

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 16h38   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Citation:
Envoyé par CHRISTOPHE_86 Voir le message
Le résultat donne la derniére date de commande connue pour chaque article mais il me faudrait aussi le numéro de commande
Qu'est-ce que vous souhaitez obtenir si un article a été vendu dans deux commandes différentes le même jour ?

Quel est votre SGBD ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 08h11   #5
Invité de passage
 
Responsable de service informatique
Inscription : septembre 2006
Messages : 6
Détails du profil
Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Industrie

Informations forums :
Inscription : septembre 2006
Messages : 6
Points : 2
Points : 2
J'exploite la piste donnée par ORA-007 car je suis sur une base de donnée Oracle.
En précision pour Waldar, mon champ date est en format YYYY-MM-DD HH:MM:SS il y a donc une chronologie respectée à la seconde je l'admets mais il n'y a aucun risque pour nos commandes articles car la fréquence est plus élevée.
Pour le moment j'ai un problème de perfo avec la requête de ORA-007 car la table possède 250 000 enregistrements et l'évaluation de la sous-requête pour chaque enregistrement plombe un peu les perfo.

Mercredi 09h12 :
Mauvaise nouvelle , je viens de faire le test avec l'exemple fourni par ORA-007 et en limitant la requête sur 1 seul article, mais le résultat me retourne toutes les commandes pour cet article et pas la dernière commande (celle qui a la date la plus récente).
CHRISTOPHE_86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 09h37   #6
Membre éclairé
 
Avatar de boussafi
 
Homme
Ingénieur développement logiciels
Inscription : septembre 2007
Messages : 342
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : septembre 2007
Messages : 342
Points : 397
Points : 397
Envoyer un message via Yahoo à boussafi Envoyer un message via Skype™ à boussafi
Cette requete peut repondre ton besoin
Code :
1
2
3
4
5
6
7
SELECT A.NumCde,B.NumArticle,B.Derniere_date   
FROM T1  A JOIN         
( SELECT T1.NumArticle, Max(T1.Date)Derniere_date
    FROM T1
   WHERE T1.NumArticle IS NOT NULL
GROUP BY T1.NumArticle
)B ON A.NumArticle=B.NumArticle
bonne chance
Feedback ...
boussafi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 14h26   #7
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Sur Oracle vous pouvez utiliser la fonction FIRST :
Code :
1
2
3
4
5
6
  SELECT NumArticle
       , Max(NumCde) keep (dense_rank first ORDER BY Date DESC) AS NumCde
       , Max(Date)                                              AS DateMax
    FROM T1
   WHERE NumArticle IS NOT NULL
GROUP BY NumArticle;
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 14h59   #8
Invité de passage
 
Responsable de service informatique
Inscription : septembre 2006
Messages : 6
Détails du profil
Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Industrie

Informations forums :
Inscription : septembre 2006
Messages : 6
Points : 2
Points : 2
Ok, probléme résolu par la requête de WALDAR ,merci à vous tous pour votre aide.
CHRISTOPHE_86 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 12h25.


 
 
 
 
Partenaires

Hébergement Web