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 :

Sélection sur une période avec une ligne (ou pas) en plus


Sujet :

Requêtes MySQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Sélection sur une période avec une ligne (ou pas) en plus
    Bonjour,

    Je n'arrive même pas à savoir si c'est évident ou pas du tout....
    J'ai fait une recherche mais comme je ne sais même pas quel titre mettre, c'est encore plus difficile de chercher!

    J'ai une table historique de prix

    chaque fois qu'un prix change pour un idproduit, une nouvelle ligne est créé avec la date du nouveau prix.

    Je dois remonter l'historique des prix jusqu'à une date précise.

    ex :

    table hist

    id,idproduit, date, prix

    1,1,2018-01-05,10
    2,1,2018-02-05,15
    3,2,2018-02-05,100
    4,2,2018-04-05,150
    5,3,2018-05-05,2000
    6,1,2018-06-05,30
    7,1,2018-07-05,20

    Le problème c'est qu'il faut revenir jusqu'à une date qui peut être entre 2 lignes et je dois aussi récupérer le prix qui était juste avant cette date sinon je ne pourrais pas savoir le prix qui était utilisé à cette date précise...

    ex: L'historique entre aujourd'hui et la date 2018-05-01, je devrais avoir comme résultat :


    2,1,2018-02-05,15
    6,1,2018-06-05,30
    7,1,2018-07-05,20
    4,2,2018-04-05,150
    5,3,2018-05-05,2000




    Donc une ligne avant la date 2018-05-01 , ou pas, s'il n y avait pas de prix avant, ou si il y a une ligne avec la même date 2018-05-01....


    Si quelqu'un peut m'aider, ce serait vraiment sympa. Merci beaucoup.

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    J 'ai trouvé cette solution, je ne sais pas si c'est efficace ou pas

    et j'ai un petit doute sur
    MAX(date) as date ,
    si cela n'affecte pas le
    WHERE date <= '2018-05-01'
    juste après...

    Je m'en remets à vos conseils avisés, merci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    SELECT
        t2.*
    FROM
        (
        SELECT
            id_produit,
            MAX(date) AS date
        FROM
            hist
        WHERE
            date <= '2018-05-01'
        GROUP BY
            id_produit
    ) t1
    INNER JOIN hist t2 ON
        (
            t1.idproduit = t2.idproduit AND t1.date = t2.date
        )
    UNION
    SELECT
        *
    FROM
        hist
    WHERE
        date > '2018-05-01'
    ORDER BY
        idproduit ASC,
        date ASC

  3. #3
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 384
    Points : 19 088
    Points
    19 088
    Par défaut
    Salut Igor_dev.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `historique`
    --------------
     
    --------------
    CREATE TABLE `historique`
    ( `id`        integer unsigned  NOT NULL auto_increment primary key,
      `produit`   integer unsigned  NOT NULL,
      `date`      date              NOT NULL,
      `prix`      decimal(5,2)      NOT NULL,
      index `idx` (`produit`,`date`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `historique` (`produit`,`date`,`prix`) VALUES
      (1,'2018-01-05',  10.00),
      (1,'2018-02-05',  15.00),
      (2,'2018-02-05', 100.00),
      (2,'2018-04-05', 150.00)
    --------------
     
    --------------
    select * from `historique`
    --------------
     
    +----+---------+------------+--------+
    | id | produit | date       | prix   |
    +----+---------+------------+--------+
    |  1 |       1 | 2018-01-05 |  10.00 |
    |  2 |       1 | 2018-02-05 |  15.00 |
    |  3 |       2 | 2018-02-05 | 100.00 |
    |  4 |       2 | 2018-04-05 | 150.00 |
    +----+---------+------------+--------+
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `id`           integer unsigned  NOT NULL auto_increment primary key,
      `produit`      integer unsigned  NOT NULL,
      `achat`        date              NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `test` (`produit`,`achat`) VALUES
      (1,'2018-01-01'),(2,'2018-01-01'),
      (1,'2018-01-25'),(2,'2018-03-25'),
      (1,'2018-02-25'),(2,'2018-04-25')
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+---------+------------+
    | id | produit | achat      |
    +----+---------+------------+
    |  1 |       1 | 2018-01-01 |
    |  2 |       2 | 2018-01-01 |
    |  3 |       1 | 2018-01-25 |
    |  4 |       2 | 2018-03-25 |
    |  5 |       1 | 2018-02-25 |
    |  6 |       2 | 2018-04-25 |
    +----+---------+------------+
    --------------
    select            t1.produit,
                      t1.achat,
                      t2.date,
                      t2.prix
     
               from  `test`       as t1
     
    left outer join  `historique` as t2
                 on  t2.produit  = t1.produit
                and  t2.date = ( select  max(t3.date)
                                   from  `historique` as t3
                                  where  t3.date < t1.achat
                               )
    --------------
     
    +---------+------------+------------+--------+
    | produit | achat      | date       | prix   |
    +---------+------------+------------+--------+
    |       1 | 2018-01-01 | NULL       |   NULL |
    |       2 | 2018-01-01 | NULL       |   NULL |
    |       1 | 2018-01-25 | 2018-01-05 |  10.00 |
    |       2 | 2018-03-25 | 2018-02-05 | 100.00 |
    |       1 | 2018-02-25 | 2018-02-05 |  15.00 |
    |       2 | 2018-04-25 | 2018-04-05 | 150.00 |
    +---------+------------+------------+--------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Salut Artemus

    MERCI pour ta requête! Ce n'est pas exactement ce que je recherche mais elle m'aide beaucoup pour une autre partie de mon code!

    Ce n'est pas le prix à une date donnée pour un produit donné que je cherche.

    C'est la liste de tous les prix pour chaque produit à partir d'une seule date donnée.

    Le code que j'ai proposé semble fonctionner, il me paraît un peu lourd... j'ai vraiment des progrès à faire en sql...

Discussions similaires

  1. [Forum] Récupérer pdf sur un site avec une adresse incluant une variable
    Par lerbofiwol dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 05/07/2017, 20h05
  2. Réponses: 0
    Dernier message: 24/02/2017, 12h03
  3. Réponses: 1
    Dernier message: 17/05/2015, 18h21
  4. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  5. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59

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