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 :

Recherche de la raison sociale du fournisseur de la dernière commande


Sujet :

Langage SQL

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 611
    Points : 359
    Points
    359
    Par défaut Recherche de la raison sociale du fournisseur de la dernière commande
    Bonjour,

    Je souhaite récupérer le nom du fournisseur de la commande d'achat la plus récente pour un article donnée.

    La table des fournisseurs est t_fst, la table des achats est t_achat, la table des lignes d'achat est t_achat_ligne.

    Ma jointure s'écrit de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select f.raison_sociale
    from t_fst f
    inner join t_achat a
    on a.id_fst = f.id_fst
    inner join t_achat_ligne al
    on a.id_achat = al.id_achat
    where al.id_article = 111
    Je ne vois pas comment faire en une seule requête.

    Julien.

  2. #2
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Citation Envoyé par juju05 Voir le message
    Je ne vois pas comment faire en une seule requête.
    Heu... C'est déjà en une seule requête...

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 611
    Points : 359
    Points
    359
    Par défaut
    Cette requête ne s'appuie pas sur la commande d'achat la plus récente.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 152
    Points : 1 414
    Points
    1 414
    Par défaut
    Il faut passer par un regroupement et un Max(colonne_date_achat). mais sans précision sur la structure des tables (comme le demande les règles du forum) difficile de faire plus.

    NB : ce type de question revient plusieurs fois par mois

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Je souhaite récupérer le nom du fournisseur de la commande d'achat la plus récente pour un article donnée.
    1) Date à laquelle on a acheté l'article 111 pour la dernière fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT MAX(a.date_achat) AS date_derniere_commande
    FROM t_achat a
    INNER JOIN t_achat_ligne al ON a.id_achat = al.id_achat
    WHERE al.id_article = 111
    2) Fournisseur auquel on a passé cette commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT DISTINCT f.raison_sociale
    FROM t_fst f
    INNER JOIN t_achat a1 ON a1.id_fst = f.id_fst
    	INNER JOIN t_achat_ligne al ON a1.id_achat = al.id_achat
    WHERE al.id_article = 111
    	AND a.date_achat =
    	(
    		SELECT MAX(a.date_achat) AS date_derniere_commande
    		FROM t_achat a
    		INNER JOIN t_achat_ligne al ON a.id_achat = al.id_achat
    		WHERE al.id_article = 111
    	)
    Nota :
    - Si on acheté plusieurs fois le même article le même jour à des fournisseurs différents, cette requête renverra plusieurs lignes.
    - Comme c'est pour un seul article, on peut se passer du GROUP BY. Si c'est pour plusieurs articles, alors ça devient nécessaire.

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 611
    Points : 359
    Points
    359
    Par défaut
    J'ai fait ce que tu viens de dire Cinéfil mais je me demandais si il n'y avait pas un moyen d'avoir la dernière réellement.

    Il faudrait peut-être le faire sur un timestamp de la date de création de la commande pour avoir un seul enregistrement à la sortie.

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Je suppose que tu répondais à cette note :
    Citation Envoyé par CinéPhil
    - Si on acheté plusieurs fois le même article le même jour à des fournisseurs différents, cette requête renverra plusieurs lignes.
    Il faudrait peut-être le faire sur un timestamp de la date de création de la commande pour avoir un seul enregistrement à la sortie.
    Tu n'avais pas dit que la date de commande était de type TIMESTAMP puisque tu n'as pas donné la structure des tes tables. J'ai donc fait une supposition.
    Si c'est effectivement un timestamp, il y a peu de risque, en effet, que deux commandes soient enregistrées exactement en même temps pour deux fournisseurs différents et pour le même produit.

  8. #8
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par juju05 Voir le message
    J'ai fait ce que tu viens de dire Cinéfil mais je me demandais si il n'y avait pas un moyen d'avoir la dernière réellement.

    Il faudrait peut-être le faire sur un timestamp de la date de création de la commande pour avoir un seul enregistrement à la sortie.
    Si achat.id est un auto-incrément, il est implicitement chronologique... à moins que les commandes ne soient saisies à l'avance ou en retard (à vérifier).

    Et à ce moment, se pose une question : que veut dire "la dernière" ?

    La dernière saisie ?
    La dernière passée ?
    La dernière honorée ?

    En effet, je peux saisir, dans l'ordre chronologique :
    - Une commande en date du jour
    - Une commande pour dans un mois
    - Une commande passée la semaine dernière, que j'avais laissé traîner sous mon clavier

    laquelle est réellement la dernière ?

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 611
    Points : 359
    Points
    359
    Par défaut
    J'ai supposé que c'était la dernière créée.

    Par contre ma date ne semble pas être de type timestamp.

  10. #10
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    si c'est la dernière créé, il suffit alors de prendre achat.id au lieu de achat.date il est naturellement chronologique, donc la plus grande valeur = dernier créé

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 611
    Points : 359
    Points
    359
    Par défaut
    Effectivement, au lieu de faire un max(date création de la commande), je vais récupérer le max de l'identifiant de la commande par identifiant de l'article.

    Merci bien.

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 882
    Points : 53 061
    Points
    53 061
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    si c'est la dernière créé, il suffit alors de prendre achat.id au lieu de achat.date il est naturellement chronologique, donc la plus grande valeur = dernier créé
    ça c'est stupide !!!!!

    Imaginez simplement que la compta a pris du retard et que madame Schmoll décide de saisir les dernières achats.... et prenne le tas des document à l'envers...
    Imaginez que les tables soient alimentées par un robot la nuit à partir de fichiers et que les lignes à insérer soient dans n'importe quel ordre...
    Imaginez que l'auto incrément ait un pas négatif...
    Imaginez que l'on force une valeur dans l'auto incrément...

    A +

  13. #13
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    ça c'est stupide !!!!!
    D'où la question que j'ai posé avant...

    Citation Envoyé par StringBuilder Voir le message
    Et à ce moment, se pose une question : que veut dire "la dernière" ?

    La dernière saisie ?
    La dernière passée ?
    La dernière honorée ?

    En effet, je peux saisir, dans l'ordre chronologique :
    - Une commande en date du jour
    - Une commande pour dans un mois
    - Une commande passée la semaine dernière, que j'avais laissé traîner sous mon clavier

    laquelle est réellement la dernière ?
    Réponse :

    Citation Envoyé par juju05 Voir le message
    J'ai supposé que c'était la dernière créée.
    De toute façon, sans timestamp, on ne sait pas quelle est la dernière : on sait au mieux la liste des cde saisies le dernier jours. Et le problème de la compta qui a pris du retard se posera de toute façon.

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

Discussions similaires

  1. Acompte fournisseur sur bon de commande
    Par rahfax dans le forum Odoo (ex-OpenERP)
    Réponses: 1
    Dernier message: 23/12/2016, 09h20
  2. [Débutant] Trouver un contact à partir d'une raison sociale
    Par PinkLady dans le forum VB.NET
    Réponses: 3
    Dernier message: 23/01/2014, 16h27
  3. Rechercher les 20 dernières commandes
    Par sophiec dans le forum Adaptive Server Enterprise
    Réponses: 1
    Dernier message: 22/12/2010, 10h55
  4. Réponses: 0
    Dernier message: 23/05/2008, 09h35
  5. [Avis] Fournisseur fournit produit ou commande
    Par Jiraiya42 dans le forum Schéma
    Réponses: 14
    Dernier message: 12/04/2007, 20h15

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