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

SQL Firebird Discussion :

Recupérer le dernier et avant dernier enregistrement d'une table


Sujet :

SQL Firebird

  1. #1
    Membre régulier
    Inscrit en
    Août 2007
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 158
    Points : 80
    Points
    80
    Par défaut Recupérer le dernier et avant dernier enregistrement d'une table
    Bonjour;
    Comme lancer dans le titre; j'ai la requete suivante :
    SELECT DETAIL_ACHAT.ORDRE_PRODUIT,
    PRODUIT.NOM,
    DETAIL_ACHAT.PRIX, /*avant dernier enregistrement*/
    FROM DETAIL_ACHAT
    INNER JOIN PRODUIT ON PRODUIT.ORDRE_PRODUIT =
    DETAIL_ACHAT.NUMERO_PRODUIT
    WHERE DETAIL_ACHAT.ORDRE_ACHAT = 830
    et je voudrai le dernier enr DETAIL_ACHAT.PRIX
    et l'avant dernier enr avant dernier enregistrement
    Si vous avez une requête pour cela
    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    j'aurais tendance à répondre que le mieux est de découper le problème en portions simples, c'est à dire d'utiliser des CTE

    une première pour obtenir la dernière date d'achat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WITH DERNIER AS (SELECT  NUMERO_PRODUIT,MAX(DATE_ACHAT) DA FROM DETAIL_ACHAT WHERE .... GROUP BY NUMERO_PRODUIT)
    une fois la date d'achat obtenu il est aisé de faire la liaison nécessaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT D.ORDRE_PRODUIT,P.NOM,D.PRIX FROM DETAIL_ACHAT D JOIN PRODUIT P ON P.ORDRE_PRODUIT =D.NUMERO_PRODUIT
                                                                                           JOIN DERNIER ON DERNIER.NUMERO_PRODUIT=D.NUMERO_PRODUIT AND DERNIER.DA=D.DATE_ACHAT
    et l'avant dernier enr avant dernier enregistrement
    là je ne comprends pas vraiment l'avant dernier de quoi ? il s'agit de l'avant dernier prix ?
    cela doit être réalisable en utilisant un tri (ORDER BY DATE_ACHAT) et FIRST ou ROWS
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre régulier
    Inscrit en
    Août 2007
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 158
    Points : 80
    Points
    80
    Par défaut
    Bonjour;
    Merci pour la réponse ;
    Je veux récupérer le dernier et l'avant dernier prix dans une même requête .
    Pour le dernier c'est facile mais l'avant dernier est le problème.

  4. #4
    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 346
    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 346
    Points : 18 958
    Points
    18 958
    Par défaut
    Salut gentilman_delphi.

    Pour répondre avec exactitude à votre problème, il nous faudrait :
    --> le descriptif de vos deux tables.
    --> un jeu d'essai représentatif de votre problème.
    --> la solution, à partir du jeu d'essai, que vous attendez.

    Autrement dit, il nous fait un critère fiable pour ordonner vos lignes.
    A partir de cette ordonnancement, nous serions capable de vous restituer n'importe quelle ligne de votre extraction.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par gentilman_delphi Voir le message
    Je veux récupérer le dernier et l'avant dernier prix dans une même requête .
    Pour le dernier c'est facile mais l'avant dernier est le problème.
    le dernier et l'avant dernier peuvent s'obtenir (s'il s'agit d'un critère de date) en utilisant le ORDER BY et ROWS
    par exemple ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT NUMERO_PRODUIT,PRIX FROM DETAIL_ACHAT ORDER BY DATE_ACHAT DESC ROWS 2
    le problème est que cela fourni 2 lignes

    en passant par les CTEs cela devrait donner quelque chose comme ceci

    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
    WITH 
    -- Récupère la date la plus récente
    DERNIER AS (SELECT  ORDRE_PRODUIT DPRODUIT,MAX(DATE_ACHAT) DA FROM DETAIL_ACHAT GROUP BY ORDRE_PRODUIT),
    -- Récupère l'avant dernière date
    AVANT_DERNIER AS (SELECT D.ORDRE_PRODUIT APRODUIT,MAX(D.DATE_ACHAT) AVDA FROM DETAIL_ACHAT D JOIN DERNIER ON DERNIER.DPRODUIT=D.ORDRE_PRODUIT WHERE D.DATE_ACHAT< DERNIER.DA GROUP BY D.ORDRE_PRODUIT),
    -- Dernier Prix
    DP AS (SELECT D.ORDRE_PRODUIT APRODUIT,D.PRIX DPRIX FROM DETAIL_ACHAT A JOIN DERNIER D ON  D.DPRODUIT=A.ORDRE_PRODUIT AND D.DA=A.DATE_ACHAT),
    -- Avant Dernier Prix
    ADP AS (SELECT D.NUMERO_PRODUIT AVDP,D.PRIX AVDPRIX FROM DETAIL_ACHAT A JOIN AVANT_DERNIER D ON  D.APRODUIT=A.ORDRE_PRODUIT AND D.AVDA=A.DATE_ACHAT)
     
    SELECT D.ORDRE_PRODUIT,P.NOM,DP.DPRIX,ADP.AVDPRIX FROM DETAIL_ACHAT D 
    JOIN  PRODUIT P ON P.NUMERO_PRODUIT =D.ORDRE_PRODUIT
    JOIN DP ON DP.APRODUIT=D.ORDRE_PRODUIT
    LEFT JOIN ADP on ADP.AVDP=D.ORDRE_PRODUIT
    WHERE D.ORDRE_ACHAT = 830
    Je suis persuadé que l'on doit pouvoir mieux faire en passant par les fonctions de fenêtrage de Firebird 3
    voire avec une CTE RECURSIVE

    Mais comme l'écrit si justement Artemus24 sans un descriptif des tables (ou mieux un script de construction) et un jeu d'essais (idem via un script de remplissage) il est difficile de proposer mieux. Je m'y perd dans vos ORDRE_PRODUIT, NUMERO_PRODUIT etc..
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Membre régulier
    Inscrit en
    Août 2007
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 158
    Points : 80
    Points
    80
    Par défaut
    Bonjour;
    Un échantillon des données:
    Nom : Echantillon des données.png
Affichages : 2377
Taille : 27,4 Ko

    Maintenant je veux faire une requête des produits d'achat N° 3 avec des prix d'achat N° 3 et N°2 comme indiqué dans la deuxième imageNom : Echantillon de requete.png
Affichages : 2319
Taille : 11,7 Ko
    MERCI

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Désolé mais là, je ne suis plus. On vous demande des scripts pour créer les tables et les données vous nous montrer trois tableaux inexploitables. On (ou du moins je) ne va quand même pas se taper les structures et les données pour faire des tests !

    Remplacez la colonne date_achat par la colonne ACHAT de DETAIL_ACHAT et la solution que je vous ai proposé doit fonctionner avec les ajustements nécessaires
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    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 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Utilisez les fonctions LEAD, LAG, FIRST_VALUE, LAST_VALUE et NTH_VALUE qui sont là pour ça ...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 088
    Points : 38 393
    Points
    38 393
    Billets dans le blog
    9
    Par défaut
    Bonsoir,

    Vos tables ne comportent aucune date ni heure, la notion de premier ou dernier d'un point de vue chronologique n'a donc aucun sens

    Si toutefois vous aviez dans l'idée d'utiliser l'identifiant d'achat comme chrono, ça n'est pas possible avec un identifiant attribué par le SGBD (colonne de type "auto_incrément" ou "identity" selon le SGBD) car ces identifiants ne sont pas chronologiques (sauf sur une base mono-utilisateur et mono thread, ce qui est quand meme très rare )

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par SQLpro Voir le message
    Utilisez les fonctions LEAD, LAG, FIRST_VALUE, LAST_VALUE et NTH_VALUE qui sont là pour ça ...
    Sauf qu'elles ne sont pas là avec la version Firebird 2.5, gentil_man n'ayant pas indiqué la version utilisée c'est cette version (encore la plus utilisée AMHA) que j'ai pris par défaut.
    Cela va donner de l'eau à ton moulin pour critiquer Firebird
    Citation Envoyé par escartefigue
    Vos tables ne comportent aucune date ni heure, la notion de premier ou dernier d'un point de vue chronologique n'a donc aucun sens
    je ne voulais pas en rajouter une couche mais on voit bien que les tableaux fournis ne correspondent pas aux données des tables : pas de code produit alors que dans le premier code fourni on a une jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INNER JOIN PRODUIT ON PRODUIT.ORDRE_PRODUIT =
    DETAIL_ACHAT.NUMERO_PRODUIT
    qui en plus me parait étrange quant aux noms de colonnes.

    Mon dicton préféré est : "Un problème bien posé est à moitié résolu" à force de simplification de votre part c'est l'inverse qui se produit
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    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 346
    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 346
    Points : 18 958
    Points
    18 958
    Par défaut
    Salut à tous.

    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
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    CREATE DATABASE '..\Data\Base.fdb' page_size 4096 DEFAULT CHARACTER SET WIN1252;
     
    -- ===============================
    -- Création de la table 'PRODUITS'
    -- ===============================
     
    CREATE TABLE PRODUITS (
      id            integer generated by default as identity not null primary key,
      lib_produit   char(10)                                 not null
    );
     
    -- =========================
    -- Insertion dans 'PRODUITS'
    -- =========================
     
    insert into PRODUITS (lib_produit) values ('produit 01');
    insert into PRODUITS (lib_produit) values ('produit 02');
    insert into PRODUITS (lib_produit) values ('produit 03');
    insert into PRODUITS (lib_produit) values ('produit 04');
    insert into PRODUITS (lib_produit) values ('produit 05');
    insert into PRODUITS (lib_produit) values ('produit 06');
    insert into PRODUITS (lib_produit) values ('produit 07');
    insert into PRODUITS (lib_produit) values ('produit 08');
    insert into PRODUITS (lib_produit) values ('produit 09');
    insert into PRODUITS (lib_produit) values ('produit 10');
     
    -- ====================
    -- Vidage de 'PRODUITS'
    -- ====================
     
    select * from PRODUITS;
     
              ID LIB_PRODUIT
    ============ ===========
               1 produit 01
               2 produit 02
               3 produit 03
               4 produit 04
               5 produit 05
               6 produit 06
               7 produit 07
               8 produit 08
               9 produit 09
              10 produit 10
     
     
    commit;
     
    -- =============================
    -- Création de la table 'ACHATS'
    -- =============================
     
    CREATE TABLE ACHATS (
      id          integer generated by default as identity not null primary key,
      lib_achat   char(10)                                 not null
    );
     
    -- =======================
    -- Insertion dans 'ACHATS'
    -- =======================
     
    insert into ACHATS (lib_achat) values ('numéro 125');
    insert into ACHATS (lib_achat) values ('numéro 250');
    insert into ACHATS (lib_achat) values ('numéro 375');
     
    -- ==================
    -- Vidage de 'ACHATS'
    -- ==================
     
    select * from ACHATS;
     
              ID LIB_ACHAT
    ============ ==========
               1 numéro 125
               2 numéro 250
               3 numéro 375
     
     
    commit;
     
    -- ====================================
    -- Création de la table 'DETAIL_ACHATS'
    -- ====================================
     
    CREATE TABLE DETAIL_ACHATS (
      id       integer generated by default as identity not null primary key,
      achat    integer  REFERENCES ACHATS   (id) ON DELETE CASCADE ON UPDATE CASCADE,
      produit  integer  REFERENCES PRODUITS (id) ON DELETE CASCADE ON UPDATE CASCADE,
      prix     decimal(15,2)                            not null
    );
     
    -- ==============================
    -- Insertion dans 'DETAIL_ACHATS'
    -- ==============================
     
    insert into DETAIL_ACHATS (achat,produit,prix) values (1, 1,12);
    insert into DETAIL_ACHATS (achat,produit,prix) values (1, 2,13);
    insert into DETAIL_ACHATS (achat,produit,prix) values (1, 3,14);
    insert into DETAIL_ACHATS (achat,produit,prix) values (1, 4,15);
    insert into DETAIL_ACHATS (achat,produit,prix) values (1, 5,16);
    insert into DETAIL_ACHATS (achat,produit,prix) values (1, 6,17);
    insert into DETAIL_ACHATS (achat,produit,prix) values (1, 7,18);
    insert into DETAIL_ACHATS (achat,produit,prix) values (1, 8,19);
    insert into DETAIL_ACHATS (achat,produit,prix) values (1, 9,20);
    insert into DETAIL_ACHATS (achat,produit,prix) values (1,10,21);
     
    insert into DETAIL_ACHATS (achat,produit,prix) values (2, 1,13);
    insert into DETAIL_ACHATS (achat,produit,prix) values (2, 2,14);
    insert into DETAIL_ACHATS (achat,produit,prix) values (2, 3,15);
    insert into DETAIL_ACHATS (achat,produit,prix) values (2, 4,16);
    insert into DETAIL_ACHATS (achat,produit,prix) values (2, 5,17);
    insert into DETAIL_ACHATS (achat,produit,prix) values (2, 6,18);
    insert into DETAIL_ACHATS (achat,produit,prix) values (2, 7,19);
    insert into DETAIL_ACHATS (achat,produit,prix) values (2, 8,20);
    insert into DETAIL_ACHATS (achat,produit,prix) values (2, 9,21);
    insert into DETAIL_ACHATS (achat,produit,prix) values (2,10,22);
     
    insert into DETAIL_ACHATS (achat,produit,prix) values (3, 1,14);
    insert into DETAIL_ACHATS (achat,produit,prix) values (3, 2,15);
    insert into DETAIL_ACHATS (achat,produit,prix) values (3, 3,16);
    insert into DETAIL_ACHATS (achat,produit,prix) values (3, 4,17);
    insert into DETAIL_ACHATS (achat,produit,prix) values (3, 5,18);
    insert into DETAIL_ACHATS (achat,produit,prix) values (3, 6,19);
    insert into DETAIL_ACHATS (achat,produit,prix) values (3, 7,20);
    insert into DETAIL_ACHATS (achat,produit,prix) values (3, 8,21);
    insert into DETAIL_ACHATS (achat,produit,prix) values (3, 9,22);
    insert into DETAIL_ACHATS (achat,produit,prix) values (3,10,23);
     
    -- =========================
    -- Vidage de 'DETAIL_ACHATS'
    -- =========================
     
    select * from DETAIL_ACHATS;
     
              ID        ACHAT      PRODUIT                  PRIX
    ============ ============ ============ =====================
               1            1            1                 12.00
               2            1            2                 13.00
               3            1            3                 14.00
               4            1            4                 15.00
               5            1            5                 16.00
               6            1            6                 17.00
               7            1            7                 18.00
               8            1            8                 19.00
               9            1            9                 20.00
              10            1           10                 21.00
              11            2            1                 13.00
              12            2            2                 14.00
              13            2            3                 15.00
              14            2            4                 16.00
              15            2            5                 17.00
              16            2            6                 18.00
              17            2            7                 19.00
              18            2            8                 20.00
              19            2            9                 21.00
              20            2           10                 22.00
     
              ID        ACHAT      PRODUIT                  PRIX
    ============ ============ ============ =====================
              21            3            1                 14.00
              22            3            2                 15.00
              23            3            3                 16.00
              24            3            4                 17.00
              25            3            5                 18.00
              26            3            6                 19.00
              27            3            7                 20.00
              28            3            8                 21.00
              29            3            9                 22.00
              30            3           10                 23.00
     
     
    commit;
     
    -- ============
    -- Requête N° 1
    -- ============
     
    select      p.lib_produit,
                a.lib_achat,
                d.prix
     
          from  DETAIL_ACHATS as d
     
    inner join  PRODUITS      as p
            on  p.id = d.produit
     
    inner join  ACHATS        as a
            on  a.id = d.achat
    ;
     
    LIB_PRODUIT LIB_ACHAT                   PRIX
    =========== ========== =====================
    produit 01  numéro 125                 12.00
    produit 02  numéro 125                 13.00
    produit 03  numéro 125                 14.00
    produit 04  numéro 125                 15.00
    produit 05  numéro 125                 16.00
    produit 06  numéro 125                 17.00
    produit 07  numéro 125                 18.00
    produit 08  numéro 125                 19.00
    produit 09  numéro 125                 20.00
    produit 10  numéro 125                 21.00
    produit 01  numéro 250                 13.00
    produit 02  numéro 250                 14.00
    produit 03  numéro 250                 15.00
    produit 04  numéro 250                 16.00
    produit 05  numéro 250                 17.00
    produit 06  numéro 250                 18.00
    produit 07  numéro 250                 19.00
    produit 08  numéro 250                 20.00
    produit 09  numéro 250                 21.00
    produit 10  numéro 250                 22.00
     
    LIB_PRODUIT LIB_ACHAT                   PRIX
    =========== ========== =====================
    produit 01  numéro 375                 14.00
    produit 02  numéro 375                 15.00
    produit 03  numéro 375                 16.00
    produit 04  numéro 375                 17.00
    produit 05  numéro 375                 18.00
    produit 06  numéro 375                 19.00
    produit 07  numéro 375                 20.00
    produit 08  numéro 375                 21.00
    produit 09  numéro 375                 22.00
    produit 10  numéro 375                 23.00
     
     
    -- ============
    -- Requête N° 2
    -- ============
     
    select      p.lib_produit,
                min(d1.prix)  as prix_achat_3,
                min(d2.prix)  as prix_achat_2
     
          from  PRODUITS      as p
     
    inner join  DETAIL_ACHATS as d1
            on  d1.produit = p.id
           and  d1.achat   = 3
     
    inner join  DETAIL_ACHATS as d2
            on  d2.produit = p.id
           and  d2.achat   = 2
     
      group by  p.lib_produit;
     
    LIB_PRODUIT          PRIX_ACHAT_3          PRIX_ACHAT_2
    =========== ===================== =====================
    produit 01                  14.00                 13.00
    produit 02                  15.00                 14.00
    produit 03                  16.00                 15.00
    produit 04                  17.00                 16.00
    produit 05                  18.00                 17.00
    produit 06                  19.00                 18.00
    produit 07                  20.00                 19.00
    produit 08                  21.00                 20.00
    produit 09                  22.00                 21.00
    produit 10                  23.00                 22.00
     
    exit;
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  12. #12
    Membre régulier
    Inscrit en
    Août 2007
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 158
    Points : 80
    Points
    80
    Par défaut
    Bonjour;
    Un essai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT DETAIL_ACHATS.ID,
           PRODUITS.LIB_PRODUIT,
           DETAIL_ACHATS.PRIX,
           FROM DETAIL_ACHATS
         INNER JOIN PRODUITS ON PRODUITS.ID= DETAIL_ACHATS.PRODUIT
         WHERE DETAIL_ACHATS.PRODUITS IN (
                                            SELECT DETAIL_ACHATS.PRODUIT
                                            FROM DETAIL_ACHATS
                                            WHERE
                                            DETAIL_ACHATS.ACHAT =
                                            3
          )
    ORDER BY DETAIL_ACHATS.PRODUIT,DETAIL_ACHATS.ACHAT DESC
    m'a donné un journal des produits achetés ; c'est bien mais reste : pour chaque produit on veut l'avant dernier prix d'achat.
    Merci

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Vous avez lu ce qu'a proposé Artemus24 ? il nous faut la même chose (jusqu'à la ligne 128)
    c'est à dire vos scripts de création de table et de remplissage de celles-ci.

    De plus la requête n°2 d'Artemus24 répond à votre demande. Si vous utilisez des alias de table vous pouvez donc le faire.
    Toutefois je me dois d'y mettre un bémol, deux cas ne sont pas prévus :
    1- S'il n'y a pas d'ordre précédent (donc de prix)
    2- Si, en se basant sur le numéro d'ordre il y a un trou i.e 1,2,3,..,5 (ordre 4 supprimé)

    C'est pour cela que dans mon post #5 je passais par des CTE et un critère de date de l'ordre plutôt qu'un numéro.

    Maintenant, vous n'avez toujours pas répondu à une question simple : Quelle version de Firebird ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  14. #14
    Membre régulier
    Inscrit en
    Août 2007
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 158
    Points : 80
    Points
    80
    Par défaut
    Bonjour ;
    FB2.5

  15. #15
    Membre régulier
    Inscrit en
    Août 2007
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 158
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Salut à tous.

    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
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    CREATE DATABASE '..\Data\Base.fdb' page_size 4096 DEFAULT CHARACTER SET WIN1252;
     
    -- ===============================
    -- Création de la table 'PRODUITS'
    -- ===============================
     
    CREATE TABLE PRODUITS (
      id            integer generated by default as identity not null primary key,
      lib_produit   char(10)                                 not null
    );
     
    -- =========================
    -- Insertion dans 'PRODUITS'
    -- =========================
     
    insert into PRODUITS (lib_produit) values ('produit 01');
    insert into PRODUITS (lib_produit) values ('produit 02');
    insert into PRODUITS (lib_produit) values ('produit 03');
    insert into PRODUITS (lib_produit) values ('produit 04');
    insert into PRODUITS (lib_produit) values ('produit 05');
    insert into PRODUITS (lib_produit) values ('produit 06');
    insert into PRODUITS (lib_produit) values ('produit 07');
    insert into PRODUITS (lib_produit) values ('produit 08');
    insert into PRODUITS (lib_produit) values ('produit 09');
    insert into PRODUITS (lib_produit) values ('produit 10');
     
    -- ====================
    -- Vidage de 'PRODUITS'
    -- ====================
     
    select * from PRODUITS;
     
              ID LIB_PRODUIT
    ============ ===========
               1 produit 01
               2 produit 02
               3 produit 03
               4 produit 04
               5 produit 05
               6 produit 06
               7 produit 07
               8 produit 08
               9 produit 09
              10 produit 10
     
     
    commit;
     
    -- =============================
    -- Création de la table 'ACHATS'
    -- =============================
     
    CREATE TABLE ACHATS (
      id          integer generated by default as identity not null primary key,
      lib_achat   char(10)                                 not null
    );
     
    -- =======================
    -- Insertion dans 'ACHATS'
    -- =======================
     
    insert into ACHATS (lib_achat) values ('numéro 125');
    insert into ACHATS (lib_achat) values ('numéro 250');
    insert into ACHATS (lib_achat) values ('numéro 375');
     
    -- ==================
    -- Vidage de 'ACHATS'
    -- ==================
     
    select * from ACHATS;
     
              ID LIB_ACHAT
    ============ ==========
               1 numéro 125
               2 numéro 250
               3 numéro 375
     
     
    commit;
     
    -- ====================================
    -- Création de la table 'DETAIL_ACHATS'
    -- ====================================
     
    CREATE TABLE DETAIL_ACHATS (
      id       integer generated by default as identity not null primary key,
      achat    integer  REFERENCES ACHATS   (id) ON DELETE CASCADE ON UPDATE CASCADE,
      produit  integer  REFERENCES PRODUITS (id) ON DELETE CASCADE ON UPDATE CASCADE,
      prix     decimal(15,2)                            not null
    );
     
    -- ==============================
    -- Insertion dans 'DETAIL_ACHATS'
    -- ==============================
     
    insert into DETAIL_ACHATS (achat,produit,prix) values (1, 1,12);
    insert into DETAIL_ACHATS (achat,produit,prix) values (1, 2,13);
    insert into DETAIL_ACHATS (achat,produit,prix) values (1, 3,14);
    insert into DETAIL_ACHATS (achat,produit,prix) values (1, 4,15);
    insert into DETAIL_ACHATS (achat,produit,prix) values (1, 5,16);
    insert into DETAIL_ACHATS (achat,produit,prix) values (1, 6,17);
    insert into DETAIL_ACHATS (achat,produit,prix) values (1, 7,18);
    insert into DETAIL_ACHATS (achat,produit,prix) values (1, 8,19);
    insert into DETAIL_ACHATS (achat,produit,prix) values (1, 9,20);
    insert into DETAIL_ACHATS (achat,produit,prix) values (1,10,21);
     
    insert into DETAIL_ACHATS (achat,produit,prix) values (2, 1,13);
    insert into DETAIL_ACHATS (achat,produit,prix) values (2, 2,14);
    insert into DETAIL_ACHATS (achat,produit,prix) values (2, 3,15);
    insert into DETAIL_ACHATS (achat,produit,prix) values (2, 4,16);
    insert into DETAIL_ACHATS (achat,produit,prix) values (2, 5,17);
    insert into DETAIL_ACHATS (achat,produit,prix) values (2, 6,18);
    insert into DETAIL_ACHATS (achat,produit,prix) values (2, 7,19);
    insert into DETAIL_ACHATS (achat,produit,prix) values (2, 8,20);
    insert into DETAIL_ACHATS (achat,produit,prix) values (2, 9,21);
    insert into DETAIL_ACHATS (achat,produit,prix) values (2,10,22);
     
    insert into DETAIL_ACHATS (achat,produit,prix) values (3, 1,14);
    insert into DETAIL_ACHATS (achat,produit,prix) values (3, 2,15);
    insert into DETAIL_ACHATS (achat,produit,prix) values (3, 3,16);
    insert into DETAIL_ACHATS (achat,produit,prix) values (3, 4,17);
    insert into DETAIL_ACHATS (achat,produit,prix) values (3, 5,18);
    insert into DETAIL_ACHATS (achat,produit,prix) values (3, 6,19);
    insert into DETAIL_ACHATS (achat,produit,prix) values (3, 7,20);
    insert into DETAIL_ACHATS (achat,produit,prix) values (3, 8,21);
    insert into DETAIL_ACHATS (achat,produit,prix) values (3, 9,22);
    insert into DETAIL_ACHATS (achat,produit,prix) values (3,10,23);
     
    -- =========================
    -- Vidage de 'DETAIL_ACHATS'
    -- =========================
     
    select * from DETAIL_ACHATS;
     
              ID        ACHAT      PRODUIT                  PRIX
    ============ ============ ============ =====================
               1            1            1                 12.00
               2            1            2                 13.00
               3            1            3                 14.00
               4            1            4                 15.00
               5            1            5                 16.00
               6            1            6                 17.00
               7            1            7                 18.00
               8            1            8                 19.00
               9            1            9                 20.00
              10            1           10                 21.00
              11            2            1                 13.00
              12            2            2                 14.00
              13            2            3                 15.00
              14            2            4                 16.00
              15            2            5                 17.00
              16            2            6                 18.00
              17            2            7                 19.00
              18            2            8                 20.00
              19            2            9                 21.00
              20            2           10                 22.00
     
              ID        ACHAT      PRODUIT                  PRIX
    ============ ============ ============ =====================
              21            3            1                 14.00
              22            3            2                 15.00
              23            3            3                 16.00
              24            3            4                 17.00
              25            3            5                 18.00
              26            3            6                 19.00
              27            3            7                 20.00
              28            3            8                 21.00
              29            3            9                 22.00
              30            3           10                 23.00
     
     
    commit;
     
    -- ============
    -- Requête N° 1
    -- ============
     
    select      p.lib_produit,
                a.lib_achat,
                d.prix
     
          from  DETAIL_ACHATS as d
     
    inner join  PRODUITS      as p
            on  p.id = d.produit
     
    inner join  ACHATS        as a
            on  a.id = d.achat
    ;
     
    LIB_PRODUIT LIB_ACHAT                   PRIX
    =========== ========== =====================
    produit 01  numéro 125                 12.00
    produit 02  numéro 125                 13.00
    produit 03  numéro 125                 14.00
    produit 04  numéro 125                 15.00
    produit 05  numéro 125                 16.00
    produit 06  numéro 125                 17.00
    produit 07  numéro 125                 18.00
    produit 08  numéro 125                 19.00
    produit 09  numéro 125                 20.00
    produit 10  numéro 125                 21.00
    produit 01  numéro 250                 13.00
    produit 02  numéro 250                 14.00
    produit 03  numéro 250                 15.00
    produit 04  numéro 250                 16.00
    produit 05  numéro 250                 17.00
    produit 06  numéro 250                 18.00
    produit 07  numéro 250                 19.00
    produit 08  numéro 250                 20.00
    produit 09  numéro 250                 21.00
    produit 10  numéro 250                 22.00
     
    LIB_PRODUIT LIB_ACHAT                   PRIX
    =========== ========== =====================
    produit 01  numéro 375                 14.00
    produit 02  numéro 375                 15.00
    produit 03  numéro 375                 16.00
    produit 04  numéro 375                 17.00
    produit 05  numéro 375                 18.00
    produit 06  numéro 375                 19.00
    produit 07  numéro 375                 20.00
    produit 08  numéro 375                 21.00
    produit 09  numéro 375                 22.00
    produit 10  numéro 375                 23.00
     
     
    -- ============
    -- Requête N° 2
    -- ============
     
    select      p.lib_produit,
                min(d1.prix)  as prix_achat_3,
                min(d2.prix)  as prix_achat_2
     
          from  PRODUITS      as p
     
    inner join  DETAIL_ACHATS as d1
            on  d1.produit = p.id
           and  d1.achat   = 3
     
    inner join  DETAIL_ACHATS as d2
            on  d2.produit = p.id
           and  d2.achat   = 2
     
      group by  p.lib_produit;
     
    LIB_PRODUIT          PRIX_ACHAT_3          PRIX_ACHAT_2
    =========== ===================== =====================
    produit 01                  14.00                 13.00
    produit 02                  15.00                 14.00
    produit 03                  16.00                 15.00
    produit 04                  17.00                 16.00
    produit 05                  18.00                 17.00
    produit 06                  19.00                 18.00
    produit 07                  20.00                 19.00
    produit 08                  21.00                 20.00
    produit 09                  22.00                 21.00
    produit 10                  23.00                 22.00
     
    exit;
     
    Appuyez sur une touche pour continuer...
    @+
    Bonjour;
    C'est une bonne solution partielle parce que dans la cas general les produits ne subissent pas obligatoirement des achats: ex produit1 peut être acheté dans l'achat N et ne va pas être acheter dans l'achat suivante.
    Merci

  16. #16
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Firebird 2.5 donc pas de fonction de fenêtrage mais possibilité de récursivité
    déjà avez vous essayé avec les CTE tel que je vous l'avais proposé ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. [VB6] Allez en avant dernier enregistrement d'une table acce
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 10/02/2006, 16h42
  2. comment rechercher les derniers enregistrement d'une table ?
    Par hornetboy dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/09/2005, 10h13
  3. Récupérer dernier enregistrement d'une table?
    Par Invité dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 19/01/2004, 12h38
  4. Réponses: 10
    Dernier message: 01/08/2003, 14h45
  5. Trouver le dernier enregistrement d'une table
    Par remi59 dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/03/2003, 15h54

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