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

Requêtes MySQL Discussion :

Historique des prix


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Points : 9
    Points
    9
    Par défaut Historique des prix
    Bonjour, j'ai une table historique avec les prix de chaque produit contenu dans une autre table. (le tout en MySQL)
    Elle ressemble à ceci :
    ----------------------------------
    id_historique - id_produit - date_heure - prix_ht - taux_promotion
    1 - 1 - 2009-02-08 00:00:00 - 4.8 - 0
    2 - 1 - 2009-02-10 11:45:51 - 5 - 0
    3 - 1 - 2009-02-18 12:02:04 - 4.6 - 0
    4 - 2 - 2009-02-18 12:02:10 - 0.6 - 0
    ----------------------------------

    Je voudrais avoir le prix de chaque produit à une date donnée.
    Par exemple : à 2009-02-14 12:00:00, le prix était 5.00€ pour le produit 1 et 0.60€ pour le produit 2
    J'ai conscience que ça doit être super facile comme requête mais mon niveau en SQL est vraiment mauvais.

    Merci de votre aide.

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Non, ce n'est pas une requête super-facile... Au contraire, puisqu'il faut ramener le prix le plus récent par produit pour une date donnée...
    Au passage, dans ton exemple, le produit 2 n'a pas de prix au 14 février...

    Donc, il faut être au moins en MySQL 4.1 pour faire ça en une seule requête, vu qu'il va falloir passer par une sous-requête.
    Ca nous donne quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT id_historique, id_produit, prix_ht, taux_promotion
    FROM historique h
    WHERE h.date_heure < '2009-02-14'
    AND (
      SELECT COUNT(*)
      FROM historique h2
      WHERE h.id_produit = h2.id_produit
      AND h2.date_heure < '2009-02-14'
      AND h2.date_heure > h.date_heure
    ) < 1
    Pas si évident .

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    voici mes deux versions...

    avec sous-requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select *
    from ta_table T1
    where '2009-02-14 12:00:00' between date_heure and COALESCE(
      (SELECT min(date_heure) from ta_table T2 where T2.id_produit = T1.id_produit),
      '3000-12-31'
      )
    équivalent en transformant la sous-requête en jointure (utilisable dans les vieilles versions, et beaucoup plus rapide à exécuter s'il y a bcp de données) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select T1.*
    from ta_table T1
      left join ta_table T2 on T1.dateheure < T2.dateheure and T1.id_produit = T2.id_produit
    group by T1.id_historique
    having '2009-02-14 12:00:00' between MIN(T1.dateheure) and coalesce(MIN(T2.date_heure), '3000-12-31')
    A noter que je suis en train de préparer le bug de l'an 3001...
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  4. #4
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Points : 9
    Points
    9
    Par défaut
    Merci ced et Antoun, toutes vos solutions fonctionnent parfaitement

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Citation Envoyé par Antoun Voir le message
    équivalent en transformant la sous-requête en jointure (utilisable dans les vieilles versions, et beaucoup plus rapide à exécuter s'il y a bcp de données) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select T1.*
    from ta_table T1
      left join ta_table T2 on T1.dateheure < T2.dateheure and T1.id_produit = T2.id_produit
    group by T1.id_historique
    having '2009-02-14 12:00:00' between MIN(T1.dateheure) and coalesce(MIN(T2.date_heure), '3000-12-31')
    Joli , mais 100% spécifique à MySQL, avec sa particularité d'autoriser un GROUP BY pas du tout conforme à la norme SQL...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par ced Voir le message
    Joli , mais 100% spécifique à MySQL, avec sa particularité d'autoriser un GROUP BY pas du tout conforme à la norme SQL...
    Oui, tu fais bien de le souligner. Voici une version normalisée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT T1.id_historique, T1.id_produit, T1.prix_ht, T1.taux_promotion
    FROM ta_table T1
      LEFT JOIN ta_table T2 ON T1.dateheure < T2.dateheure AND T1.id_produit = T2.id_produit
    GROUP BY T1.id_historique, T1.id_produit, T1.prix_ht, T1.taux_promotion
    HAVING '2009-02-14 12:00:00' BETWEEN MIN(T1.dateheure) AND coalesce(MIN(T2.date_heure), '3000-12-31')
    Ceci dit, avec un autre SGBD que MySQL, les problèmes d'optimisation des sous-requêtes seraient sans doute moins cruciaux, et on pourrait en rester à une version sans jointure.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

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

Discussions similaires

  1. Historique des modifications de prix
    Par Kamembert dans le forum Requêtes
    Réponses: 6
    Dernier message: 31/07/2009, 14h54
  2. Réponses: 4
    Dernier message: 01/05/2008, 17h40
  3. [Struts]Historique des liens!
    Par Sniper37 dans le forum Struts 1
    Réponses: 2
    Dernier message: 02/11/2005, 08h55
  4. Réponses: 1
    Dernier message: 26/10/2005, 14h35
  5. historique des bases de donnees
    Par killer dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 31/05/2005, 07h49

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