Requête SQL dernières réf par date

Bonjour,

J'ai une table de prix contenant 3 rubriques : référence, prix et date de mise en place du prix.
J'aimerais pouvoir récupérer à l'aide d'une (ou plusieurs) requêtes la liste des références sans doublons avec le dernier prix en date. Comment puis-je faire ?

Merci de votre aide

7 réponses

  • Votes
  • Date
  • Date décroissante
  1. Avec une requête sql très simple, que tu vas trouver en lisant : https://www.commentcamarche.net/contents/1068-sql-commande-select
    1. Merci de ton aide, mais je connais déjà ces commandes. Le problème c'est qu'avec DISTINCT, ça ne marche que si je ne sors qu'une seule rubrique (j'ai bien une liste de réf sans doublons). Or, j'ai besoin de récupérer les 3 rubriques. Par exemple avec ces données :

      Produit_1, Prix_1, 01/06/2008
      Produit_1, Prix_2, 10/06/2008
      Produit_2, Prix_1, 01/06/2008
      Produit_2, Prix_2, 10/06/2008
      Produit_3, Prix_1, 10/06/2008

      J'aimerais récupérer :

      Produit_1, Prix_2, 10/06/2008
      Produit_2, Prix_2, 10/06/2008
      Produit_3, Prix_1, 10/06/2008

      Je ne trouve pas comment formuler ma requête...
      1. @Utilisateur anonymeMerci pour tes indications, je ne connaissais pas l'instruction MAX et ça m'a aidé, mais je crois en fait qu'il n'est pas possible de faire ce que je veux en une seule requête.
        J'ai fait ça :

        select reference, max(datemiseenplace) from pxvente group by reference

        Je récupère bien mes réf avec le dernier prix de chacune mais je n'est pas le prix. Si j'aoute le prix au select, je suis forcé de l'ajouter aussi au group by et mes références sont donc en double.

        Si tu as une idée pour formuler ça en une seule requête, je suis preneur !
        Sinon, encore merci ;)
    2. Bonjour Mangoustine,

      En fait le code suivant devrait faire ce que tu veux
      select reference , datemiseenplace, prix from pxvente
      where reference||cast(datemiseenplace as char(10))
      in
      (select reference||cast(max(datemiseenplace) as char(10))
      from pxvente
      group by reference


      Les caractères || servent à concaténer deux colonnes (en Oracle), si tu utilises Sql Server, remplace les par le caractère +, si tu utilise Mysql, le code est alors
      select reference , datemiseenplace, prix from pxvente
      where concat(reference,cast(datemiseenplace as char(10)))
      in
      (select concat(reference,cast(max(datemiseenplace) as char(10)))
      from pxvente
      group by reference


      En espérant que cela pourra t'aider.

      A plus
      1. Merci à tous pour votre aide.
        En fait, j'ai dû faire une jointure entre 2 requêtes pour arriver au résultat que je voulais. En effet, la fonction max ne peut être utilisée que dans une instruction SELECT ou HAVING, mais pas dans CONCAT (je travaille sous Windev et c'est ce que le moteur SQL me renvoyait lorsque j'essayais les solutions que vous m'avez proposées).

        Merci encore,

        Mangoustine
    3. Bonjour,

      Est-ce que tu peux me donner ton code ?

      Merci
      1. Voici le code de ma requête, à adapter suivant tes rubriques :

        SELECT

        PxVentePackage.Package,
        PxVentePackage.PxVenteEuros,
        PxVentePackage.[PxVente$] AS PxVenteDollars,
        PxVentePackage.DateMiseEnPlace
        FROM
        PxVentePackage INNER JOIN (SELECT
        PxVentePackage.Package AS PackageLu,
        MAX(PxVentePackage.DateMiseEnPlace) AS le_maximum_DateMiseEnPlace
        FROM
        PxVentePackage
        GROUP BY
        PxVentePackage.Package)
        ON (PxVentePackage.DateMiseEnPlace = le_maximum_DateMiseEnPlace)
        AND (PxVentePackage.Package = PackageLu)
    4. Windev ne veut pas l'executer. Il n'affiche pas une message d'erreur mais quand je clic sur GO, rien ne se passe.
      Quelqu'un a une idée?
      1. Windev ne veut pas l'executer. Il n'affiche pas une message d'erreur mais quand je clic sur GO, rien ne se passe.
        Quelqu'un a une idée?

        Windev 11