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 :

[SQL Server]Regroupement et récupération de la dernière date


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 10
    Points
    10
    Par défaut [SQL Server]Regroupement et récupération de la dernière date
    Bonjour,

    J'ai une base de données simple avec 2 tables :

    L'une contenant une liste de produits (avec un id unique) et son nom
    | ID_PRODUIT | NOM_PRODUIT |
    L'autre contenant l'id du produit, une date et un prix. Pour chaque id_produit on aura donc autant d'enregistrement que de dates, le prix d'un produit changeant tous les jours.
    | ID_PRODUIT | DATE | PRIX |

    Je cherche à lancer une requête me renvoyant pour chaque produit le dernier prix pratiqués ainsi que la date correspondante.

    J'aurai donc en retour autant d'enregistrements que de produits.

    J'ai donc un souci avec la récupération du top 1 en date desc pour chacun de mes produits

    Merci de votre aide

  2. #2
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 24
    Points : 22
    Points
    22
    Par défaut
    Salut Essaye une requête comme cela :

    select a.nom_produit, b.date, b.prix
    from a inner join b on a.id_produit=b.id_produit
    group by a.nom_produit
    having b.date = max(b.date)

    Par contre, je me pose des questions sur l'intégrité référentiel de ton schéma, à savoir que id_produit tel que tu le décris n'est pas pas une clef...

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Merci pour ta réponse,

    En fait j'ai un pb avec la requête que tu m'as envoyé du fait que les champs date et prix ne sont pas inclus dans la clause Group By, du coups la requête n'est pas acceptée.

    Juste pour précision concernant mes tables, les dates les plus récentes ne sont pas forcément les mêmes pour tous les produits, les prix de chaque produit n'étant pas mis à jour à la même fréquence.

    T_PRODUIT
    ID_PRODUIT | NOMPRODUIT
    1 TABLE
    2 CHAISE

    T_PRIXPRODUITS
    ID_PRODUIT | DATEPRIX | PRIX
    1 10/03/2006 3,05
    2 13/03/2006 1
    2 14/03/2006 1,2
    1 15/03/2006 3,4
    2 16/03/2006 1,3

    Résultat de requête souhaité
    ID | DATE | PRIX
    1 15/03/2006 3,4
    2 16/03/2006 1,3

  4. #4
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Pour le GROUP BY, cela dépend des SGBD.

    Sur Oracle, tu n'es pas obligé de tout mettre dans le GROUP BY, sur SQL Server si. Mais tu ne l'as pas précisé.

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    En effet je travaille sur Sql Server 2000.

    Autre piste pouvant m'aider sur le même problème, en fait si on reprend seulement la table de prix avec comme colonne ID | date | prix, il faudrait obtenir en résultat de requête la liste distinctes des produits avec pour chacun le prix le plus récent et la date correspondante.

    J'imagine que cela doit être simple mais je bloque sur ce point.


    Merci encore de votre aide

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 24
    Points : 22
    Points
    22
    Par défaut
    et moi sur Oracle ...
    Par contre je te réitére mon conseil, change ta conception car elle n'est pas propre, il te faut une vraie clef, car ton modèle tel quel est inutilisable...

  7. #7
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Merci pour ces conseils,

    Cependant mon problème ne concerne pas mon modèle de données mais plutôt la manière de réaliser le type de requête décrit ci-dessus.

    L'exemple décrit plus haut ne reflète pas l'état acteul de ma base, qui possède bien sur les clés et index nécessaires.

    Mais pour schématiser au mieu mon besoin j'ai essayé de prendre un modèle on ne peut plus light.

    -----------

    Pour revenir à la problématique, j'ai pu réaliser ce que je voulais avec access et son assistant. La requête généré est la suivante :

    SELECT Max(T_PRIXPRODUITS.DATE) AS MaxDeDATE, First(T_PRIXPRODUITS.PRIX) AS PremierDePRIX, T_PRODUITS.ID
    FROM T_PRIXPRODUITS INNER JOIN T_PRODUITS.ID ON T_PRIXPRODUITS.ID = T_PRODUITS.ID
    GROUP BY T_PRODUITS.ID;

    Le problème maintenant est que la fonction first n'est pas reconnue sous sql server.


    Merci de votre coups de main !

  8. #8
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT
       T_PRIXPRODUITS.DATE,
       T_PRIXPRODUITS.PRIX,
       T_PRODUITS.ID
    FROM
       T_PRIXPRODUITS INNER JOIN
       T_PRODUITS.ID ON T_PRIXPRODUITS.ID = T_PRODUITS.ID
    GROUP BY
       T_PRODUITS.ID,
       T_PRIXPRODUITS.DATE,
       T_PRIXPRODUITS.PRIX
    HAVING
       T_PRODUITS.DATE = MAX(T_PRODUITS.DATE);
    Ca fonctionne ca ?

  9. #9
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    Essaie ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select a.nom_produit, b.date, b.prix 
    from t_produit a inner join t_prixproduit b on a.id_produit=b.id_produit
    where b.date = (select max(b1.date) from t_prixproduit b1 where b1.id_produit = b.id_produit)
    @+

  10. #10
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    La table T_PRODUITS n'a pas de champs DATE, et même en groupant sur le champs DATE de T_PRIXPRODUITS la requête me renvoie tous les enregistrement de mon historique de tarif.



    Peut être avec des sous requêtes ? qu'en pensez vous ?



    Edit 1 :
    Je n'avais pas vu ton message SLE, j'essaie et je reviens ...

    Edit 2 :
    A première vue ca marche ! je valide tout cela dans mon projet et ferme le post si tout va bien

    Merci de votre aide !!!

Discussions similaires

  1. [SQL-Server] SQL Server: convertir une chaine de caractères en date
    Par Louisa2005 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 16/09/2013, 10h25
  2. Réponses: 7
    Dernier message: 09/08/2011, 19h57
  3. Réponses: 10
    Dernier message: 23/11/2009, 22h49
  4. [C#] Récupération d'une image depuis une table SQL Server
    Par borgfabr dans le forum Accès aux données
    Réponses: 10
    Dernier message: 08/04/2004, 13h20
  5. Regroupement d'enregistrements en ASP/SQL Server
    Par Matlight dans le forum ASP
    Réponses: 3
    Dernier message: 02/04/2004, 13h31

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