Le SQL de A à Z

Exercices et travaux pratiques


précédentsommaire

V. Exercices - 4° Partie

V-A. Problème n° 31 - plus proche valeur

Il s'agit de rechercher la plus proche valeur dans une table.

Par exemple une table propose des jours de rendez-vous. Le client souhaiterais un rendez-vous aux alentours du 12 janvier 2008. Comment obtenir la date libre la plus proche de cette date ?

Voici la table des rendez-vous :

 
Sélectionnez
CREATE TABLE T_RENDEZ_VOUS_RDV
(RDV_DATE      TIMESTAMP); 
 
Sélectionnez
INSERT INTO T_RENDEZ_VOUS_RDV VALUES ('2008-01-07');
INSERT INTO T_RENDEZ_VOUS_RDV VALUES ('2008-01-11');
INSERT INTO T_RENDEZ_VOUS_RDV VALUES ('2008-01-14');
INSERT INTO T_RENDEZ_VOUS_RDV VALUES ('2008-01-16');
INSERT INTO T_RENDEZ_VOUS_RDV VALUES ('2008-01-18');
INSERT INTO T_RENDEZ_VOUS_RDV VALUES ('2008-01-21');
INSERT INTO T_RENDEZ_VOUS_RDV VALUES ('2008-01-22');
INSERT INTO T_RENDEZ_VOUS_RDV VALUES ('2008-01-24');
INSERT INTO T_RENDEZ_VOUS_RDV VALUES ('2008-01-25'); 

C'est plus facile que cela en à l'air, si l'on se souvient qu'un nombre premier est un nombre qui n'est divisible que par lui même et 1. Ou plutôt qu'un nombre qui n'est pas premier est divisible par un nombre compris entre 2 et lui-même moins un...

En l'occurrence, le résultat doit être le suivant :

 
Sélectionnez
RDV_DATE                                               
-------------
2008-01-11 

Testez donc votre solution avec une demande de rendez-vous le 23 janvier 2008...

cliquez pour répondre et titrez votre mail " Problème n°31 - plus proche valeur "

V-B. Problème n° 32 - primes de salaires

Les employés de l'entreprise doivent recvoir une prime de salaire d'un montant donné et cette prime doit être répartie sur un nombre de mois donné. Cepandant il faut que la totalité de la prime soit donnée, chaque prime étant arrondie au centime, la dernière devant compenser les arrondis.. Par exemple si une prime de 1000 euros est versé et que cela se fait sur 12 mois, alors il faudra verser par exemple 83.33 € les 11 premiers mois et 83,37 € le dernier.

Comment faire cela en une seule requête ?

Voici la table pour le calcul des primes :

 
Sélectionnez
CREATE TABLE T_PRIME_PRM
(PRM_EMPLOYE       VARCHAR(16),
 PRM_MONTANT       DECIMAL(16,2),
 PRN_NB_ECHEANCES  INT); 
 
Sélectionnez
INSERT INTO T_PRIME_PRM VALUES ('JAK', 1000, 1);
INSERT INTO T_PRIME_PRM VALUES ('POL', 1000, 3);
INSERT INTO T_PRIME_PRM VALUES ('LUC', 1000, 12); 

Et le résultat attendu :

 
Sélectionnez
PRM_EMPLOYE  ECHEANCE  MONTANT
------------ --------- ------------
JAN          1         1000.00
JOE          1         333.33
JOE          2         333.33
JOE          3         333.34
LUC          1         83.33
LUC          2         83.33
LUC          3         83.33
LUC          4         83.33
LUC          5         83.33
LUC          6         83.33
LUC          7         83.33
LUC          8         83.33
LUC          9         83.33
LUC          10        83.33
LUC          11        83.33
LUC          12        83.37  

A vos claviers !

cliquez pour répondre et titrez votre mail " Problème n°32 - primes de salairesr "
 
 

V-C. Problème n° 33 - affectations comptables

Notre utilisateur travaille dans une entreprise comptable et doit affecter au plus juste certains éléments à des comptes plus ou moins "flous"

Un petit exemple vallant mieux qu'un long discours, voici les données de son problème :

Exemple des données comptables  :
Sélectionnez
compte   ana      montant
-------- -------- ------------
612000   26045    260.50
612000   12345    130.40
612101   33556    330.50
654000   26346     33.55
654102   28333    180.10 
Règles d'affectation :
Sélectionnez
compte     ana      nouvelle affectation
---------- -------- --------------------
6?????     ?????    T124
6?????     ??5??    T028
6?????     26???    T033
612???     ?????    T125
612???     ??5??    T126 
Résultat que l'on doit obtenir :
Sélectionnez
compte    montant    affectation
--------- ---------- -----------
612000    260.50     T125        -->(Regle 612??? ?????)
612000    130.40     T125        -->(Règle 612??? ?????)
612101    330.50     T126        -->(Règle 612??? ??5??)
654000     33.55     T033        -->(Règle 6????? 26???)
654102    180.10     T124        -->(Règle 6????? ?????) 

Bref, à partir de règles d'affectation comptable un peu "floues" du fait de caractères génériques, il convient de trouver la meilleure affectation comptable des données...

Voici les tables avec lesquelles nous allons devoir établir notre requête, et les données du jeu d'essai :

 
Sélectionnez
CREATE TABLE T_COMPTE_CPT
(CPT_COMPTE          CHAR(6),
 CPT_ANA             CHAR(5),
 CPT_MONTANT         DECIMAL(16,2)); 

CREATE TABLE T_AFFECTATION_AFC
(AFC_COMPTE          CHAR(6),
 AFC_ANA             CHAR(5),
 AFC_AFFECT          CHAR(4)); 
 
Sélectionnez
INSERT INTO T_COMPTE_CPT VALUES ('612000', '26045', 260.50);
INSERT INTO T_COMPTE_CPT VALUES ('612000', '12345', 130.40);
INSERT INTO T_COMPTE_CPT VALUES ('612101', '33556', 330.50);
INSERT INTO T_COMPTE_CPT VALUES ('654000', '26346', 33.55);
INSERT INTO T_COMPTE_CPT VALUES ('654102', '28333', 180.10); 

INSERT INTO T_AFFECTATION_AFC VALUES ('6_____', '_____', 'T124');
INSERT INTO T_AFFECTATION_AFC VALUES ('6_____', '__5__', 'T028');
INSERT INTO T_AFFECTATION_AFC VALUES ('6_____', '26___', 'T033');
INSERT INTO T_AFFECTATION_AFC VALUES ('612___', '_____', 'T125');
INSERT INTO T_AFFECTATION_AFC VALUES ('612___', '__5__', 'T126'); 

Je vous ais d'ailleurs déjà facilité la vie en remplacçant les ? par des _ !
Vous connaissez déjà le résultat attendu, alors en piste ! Sachez cepandant qu'une élégante solution passe par l'ajout de données...

cliquez pour répondre et titrez votre mail " Problème n°33 - affectations comptables "

V-D. Problème n° 34 - précédents (ou suivants)

Question simple et directe : comment numéroter les lignes d'une requête et prévoir d'une ligne sur l'autre la référence à la ligne précédente ?
Encore faut-il savoir quel ordre prendre en compte !

Partons d'une table on ne peut plus simple, puisque dotée d'une seule colonne :

 
Sélectionnez
CREATE TABLE T_LIGNE_PRECEDENTE
(COL VARCHAR(3)); 
 
Sélectionnez
INSERT INTO T_LIGNE_PRECEDENTE VALUES ('AAA');
INSERT INTO T_LIGNE_PRECEDENTE VALUES ('BBB');
INSERT INTO T_LIGNE_PRECEDENTE VALUES ('CCC');
INSERT INTO T_LIGNE_PRECEDENTE VALUES ('DDD'); 

Comment obtenir le résultat suivant :

 
Sélectionnez
COL  LIGNE_PRECEDENTE 
---- ---------------- 
AAA  NULL
BBB  AAA
CCC  BBB
DDD  CCC 

D'ailleurs est-il possible d'informer de la ligne suivante et de la précédente en même temps ?

cliquez pour répondre et titrez votre mail " Problème n°34 - précédente et suivants "

V-E. Problème n° 35 - matchs et victoires

Voici un développeur confronté à des classements sportifs... Nous lui laissons la parole :

Je voudrais générer un classement entre des joueurs à partir des résultats de matchs de tennis de table.
J'ai pour l'instant créé les tables suivantes :

TABLE T_JOUEUR_JOR
Sélectionnez
JOR_ID        JOR_NOM
------------- -----------
1             Dupont
2             Camus
3             Mercier 
TABLE T_MATCH_MCH
Sélectionnez

MCH_ID       JOR_ID1      JOR_ID2      MCH_SCORE_JOUEUR1  MCH_SCORE_JOUEUR2
------------ ------------ ------------ ------------------ ------------------
1            1            3            21                 15
2            3            2            17                 21
3            2            1            21                 13
4            3            1            21                 10 
Résultat attendu :
Sélectionnez

JOR_ID        JOR_NOM        NB_MATCHS     NB_VICTOIRES
------------- -------------- ------------- ---------------
1             Dupont         2             1
2             Camus          3             2
3             Mercier        3             1 

A vous de jouer !
Voici la défintion des tables et le jeu d'essais :

 
Sélectionnez
CREATE TABLE T_JOUEUR_JOR
(JOR_ID      INT,
 JOR_NOM     VARCHAR(32)); 

CREATE TABLE T_MATCH_MCH
(MCH_ID             INT,
 JOR_ID1            INT,
 JOR_ID2            INT,
 MCH_SCORE_JOUEUR1  INT,
 MCH_SCORE_JOUEUR2  INT); 
 
Sélectionnez
INSERT INTO T_JOUEUR_JOR VALUES (1, 'Dupont');
INSERT INTO T_JOUEUR_JOR VALUES (2, 'Camus');
INSERT INTO T_JOUEUR_JOR VALUES (3, 'Mercier'); 

INSERT INTO T_MATCH_MCH VALUES (1, 1, 3, 21, 15);
INSERT INTO T_MATCH_MCH VALUES (2, 3, 2, 17, 21);
INSERT INTO T_MATCH_MCH VALUES (3, 2, 1, 21, 13);
INSERT INTO T_MATCH_MCH VALUES (4, 3, 1, 21, 10); 

cliquez pour répondre et titrez votre mail " Problème n°35 - matchs et victoires "

V-F. Problème n° 36 - tri bâtard

Une mauvaise modélisation de données à fait que notre internaute désire un tri corresponsant à l'ordre numérique pour une colonne ne contenant que des chiffres mais modélisée en varchar...
Venez lui en aide afin de trier ces données comme s'il s'agissiait de nombres...

Attention, prenez en compte le fait qu'il peut ne pas y avoir que des chiffres dans cette colonne de type caractères !

 
Sélectionnez
CREATE TABLE T_PARCELLE_PCL (PCL_NUM VARCHAR(16)); 
 
Sélectionnez
INSERT INTO T_PARCELLE_PCL VALUES ('1');
INSERT INTO T_PARCELLE_PCL VALUES ('11');
INSERT INTO T_PARCELLE_PCL VALUES ('111');
INSERT INTO T_PARCELLE_PCL VALUES ('2');
INSERT INTO T_PARCELLE_PCL VALUES ('21');
INSERT INTO T_PARCELLE_PCL VALUES ('22');
INSERT INTO T_PARCELLE_PCL VALUES ('221');
INSERT INTO T_PARCELLE_PCL VALUES ('28A');
INSERT INTO T_PARCELLE_PCL VALUES ('28B');
INSERT INTO T_PARCELLE_PCL VALUES ('3'); 

Voici la réponse attendue :

 
Sélectionnez
PCL_NUM          
---------------- 
1
2
3
11
21
22
111
221
28A
28B 

cliquez pour répondre et titrez votre mail " Problème n°36 - tri bâtard "

V-G. Problème n° 37 - vote contraint

Un exercice inspiré des fameux puzzle de Joe Celko...
Une compétition de schnorkelzig ne comporte jamais que 4 compétiteurs. Dans la compétition exemple, les athlètes sont Paul, Marc, Jean et Léon.
Chaque membre du jury, et ils sont très nombreux, doit indiquer quel serait l'ordre dans lequel il voudrait placer ses champions.
Par exemple, le jury DUPONT aimerait que le podium soit : 1er Jean, 2nd Marc, 3e Léon, 4e Paul.
Mais les membres du jury peuvent laisser leur podium incomplet. Ainsi le jury MARTIN, aimerait le podium suivant : 1er Léon, 2nd Paul, 3e Marc. Dans ce cas Jean aurait un marqueur NULL (absence de valeur).
Si le podium est incomplet, il doit aun moins être en séquence. Par exemple 1, 2, 3 ou 1, 2, ou 1, mais pas 1, 3, 4.
Aucun podium ne peut se faire avec des ex aecquo. Par exemple 1, 2, 2, 4.
Il n'est pas possible que le podium soit vide...

La table destinée à recevoir les votes est ainsi constituée :

 
Sélectionnez
CREATE TABLE T_SCHNORKELZIG_SKZ 
(SKZ_JURY VARCHAR(16) NOT NULL PRIMARY KEY,
 SKZ_MARC  INT,
 SKZ_PAUL  INT,
 SKZ_JEAN  INT,
 SKZ_LEON  INT) 

Votre mission, si vous l'acceptez, sera d'écrire les contraintes nécessaires à valider la saisie et empêcher notamment des erreurs telles que :

 
Sélectionnez
SKZ_JURY    SKZ_MARC    SKZ_PAUL    SKZ_JEAN    SKZ_LEON
----------- ----------- ----------- ----------- -----------
MOULIN      1           3           5           11         --> restreindre le vote à 1,2,3,4
DUVAL       1           NULL        3           4          --> séquence incorrecte, aurait  être 1, NULL, 2, 3 
SCHMIDT     1           1           2           3          --> doublon (présence du 1 deux fois) 

Voici deux jeux d'essais. Le premier doit voir toutes ses lignes acceptées, le second aucune...

podiums corrects
Sélectionnez
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY001', 1, 2, 3, 4)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY002', 1, 2, 4, 3)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY003', 1, 3, 2, 4)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY004', 1, 3, 4, 2)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY005', 2, 1, 3, 4)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY006', 2, 1, 4, 3)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY007', 3, 1, 2, 4)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY008', 4, 3, 1, 2)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY009', 1, NULL, 3, 2)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY010', NULL, 2, 1, 3)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY011', 1, 3, NULL, 2)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY012', 1, 3, 2, NULL)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY013', NULL, 2, 1, NULL)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY014', 1, NULL, NULL, 2)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY015', 1, NULL, NULL, NULL) 
podiums incorrects
Sélectionnez
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY999', 1, 2, 3, 3)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY998', 1, 2, 3, 5)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY997', 1, 1, 2, 2)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY996', 1, 3, 3, 3)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY995', 1, 2, 2, 6)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY994', NULL, 2, 3, 4)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY993', NULL, 3, 3, 4)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY992', 2, 2, 3, 4)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY991', 1, 1, 1, 1)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY990', NULL, NULL, 6, 4)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY989', NULL, 6, 4, NULL)
INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY988', NULL, NULL, 2, NULL) 


Pour cela vous devez créer une contrainte SQL, et une seule, la plus concise possible.  Pour ma part j'ai réussi cette contrainte avec 114 caractères en faisant appel une seule fois à chacune des 4 colonnes...

cliquez pour répondre et titrez votre mail " Problème n°37 - vote contraint "

V-H. Problème n° 38 - propriété bien gardée

Monsieur Fulmington est un milliardaire qui possède une charmante propriété à Saint Jean Cap Ferrat. 168 pièces, 382 hectares de jardins, 2 874 oeuvres d'art et 6 gardiens.
Le problème est que Monsieur Fulmington ne sait pas si sa propriété est gardée en permanence. Pourriez vous l'aider et regarder sur une semaine, celle allant du 1er au 7 septembre 2008, quelles sont la ou les périodes pendant lesquelles la propriété n'est pas surveillée ? Le planning de gardiennage figure dans la table suivante :

 
Sélectionnez
CREATE TABLE T_GARDIENNAGE_GDN
(GDN_NOM              VARCHAR(16),
 GDN_DATEHEURE_DEBUT  TIMESTAMP,
 GDN_DATEHEURE_FIN    TIMESTAMP) ;
 
Sélectionnez
INSERT INTO T_GARDIENNAGE_GDN VALUES ('LEON', '2008-09-01 22:30:00', '2008-09-02 08:00:00') ;
INSERT INTO T_GARDIENNAGE_GDN VALUES ('LEON', '2008-09-03 18:00:00', '2008-09-04 04:30:00') ;
INSERT INTO T_GARDIENNAGE_GDN VALUES ('LEON', '2008-09-07 06:00:00', '2008-09-07 12:30:00') ;
INSERT INTO T_GARDIENNAGE_GDN VALUES ('MARC', '2008-09-01 07:30:00', '2008-09-01 14:30:00') ;
INSERT INTO T_GARDIENNAGE_GDN VALUES ('MARC', '2008-09-03 08:30:00', '2008-09-03 16:00:00') ;
INSERT INTO T_GARDIENNAGE_GDN VALUES ('MARC', '2008-09-05 09:30:00', '2008-09-05 12:00:00') 
INSERT INTO T_GARDIENNAGE_GDN VALUES ('MARC', '2008-09-06 08:30:00', '2008-09-06 13:30:00') ;
INSERT INTO T_GARDIENNAGE_GDN VALUES ('PAUL', '2008-09-02 06:00:00', '2008-09-02 17:30:00') ;
INSERT INTO T_GARDIENNAGE_GDN VALUES ('PAUL', '2008-09-03 06:00:00', '2008-09-03 17:30:00') ;
INSERT INTO T_GARDIENNAGE_GDN VALUES ('PAUL', '2008-09-04 06:00:00', '2008-09-04 17:30:00') ;
INSERT INTO T_GARDIENNAGE_GDN VALUES ('PAUL', '2008-09-06 12:00:00', '2008-09-06 22:30:00') ;
INSERT INTO T_GARDIENNAGE_GDN VALUES ('JACK', '2008-09-02 08:30:00', '2008-09-02 16:00:00') ;
INSERT INTO T_GARDIENNAGE_GDN VALUES ('JACK', '2008-09-05 08:30:00', '2008-09-05 21:30:00') ;
INSERT INTO T_GARDIENNAGE_GDN VALUES ('JACK', '2008-09-06 21:00:00', '2008-09-07 10:30:00') ;
INSERT INTO T_GARDIENNAGE_GDN VALUES ('DICK', '2008-09-01 12:30:00', '2008-09-02 00:00:00') ;
INSERT INTO T_GARDIENNAGE_GDN VALUES ('DICK', '2008-09-03 22:30:00', '2008-09-04 10:00:00') ;
INSERT INTO T_GARDIENNAGE_GDN VALUES ('DICK', '2008-09-06 16:30:00', '2008-09-07 10:30:00') ;
INSERT INTO T_GARDIENNAGE_GDN VALUES ('DICK', '2008-09-07 18:30:00', '2008-09-08 06:30:00') ;
INSERT INTO T_GARDIENNAGE_GDN VALUES ('CHAD', '2008-09-01 23:30:00', '2008-09-02 11:00:00') ;
INSERT INTO T_GARDIENNAGE_GDN VALUES ('CHAD', '2008-09-04 14:30:00', '2008-09-05 08:30:00') ;
INSERT INTO T_GARDIENNAGE_GDN VALUES ('CHAD', '2008-09-06 10:30:00', '2008-09-06 21:00:00') ;

Voici le résultat attendu...

 
Sélectionnez
GDN_DATEHEURE_DEBUT      GDN_DATEHEURE_FIN        
------------------------ ------------------------ 
2008-09-01 00:00         2008-09-01 07:30
2008-09-02 17:30         2008-09-03 06:00
2008-09-03 17:30         2008-09-03 18:00
2008-09-05 21:30         2008-09-06 08:30
2008-09-07 12:30         2008-09-07 18:30 

A l'évidence, Monsieur Fulmington à du mourron à se faire !

cliquez pour répondre et titrez votre mail " Problème n°38 - propriété bien gardée "

V-I. Problème n° 39 -  abstract et mots clefs

Encore une base mal modélisée...

Dans une base documentaire figure dans une table le nom d'un article dans une colonne et dans l'autre colonne un conglomérat des mots clef (abstract) de l'article. Pour séparer les mots clef, le développeur à trouvé judicieux d'utiliser le caractère # (dièse) entre les expressions. Voici le jeu de données sur lequel nous allons travailler :

 
Sélectionnez
CREATE TABLE T_PAPIER_PPR
(PPR_TITRE     VARCHAR(36),
 PPR_ABSTRACT  VARCHAR(120)) ;
 
Sélectionnez
INSERT INTO T_PAPIER_PPR VALUES ('Les derniers roi de France', 'Histoire#Politique') ;
INSERT INTO T_PAPIER_PPR VALUES ('De Gaulle, un héro de l''histoire', 'Histoire#Politique#Guerre') ;
INSERT INTO T_PAPIER_PPR VALUES ('Les deux guerres mondiales', 'Histoire#Guerre') ;
INSERT INTO T_PAPIER_PPR VALUES ('Les années 50 en Europe', 'Histoire#Union européenne') ;
INSERT INTO T_PAPIER_PPR VALUES ('Les présidents de la république', 'Histoire#Politique') ;
INSERT INTO T_PAPIER_PPR VALUES ('Histoire de France', 'Histoire') ;

Comme vous le voyez la première forme normale n'est pas respectée puisque plusieurs informations figurent dans une seule et même colonne !
Cependant, notre quidam doit renvoyer comme réponse le nombre d'apparition des mots clefs dans une sélection d'article. Par exemple, ici, le résultat devrait être :

 
Sélectionnez
MOT_CLEF            NOMBRE
------------------- ----------
Histoire            5
Politique           3
Guerre              2
Union européenne    1 

Sauriez-vous l'aider à accomplir sa tâche ?

cliquez pour répondre et titrez votre mail " Problème n°39 - abstract et mots clefs "

V-J. Problème n° 40 -  gestion des stocks

Un problème bien classique : à partir d'une table des réception de produits et des commandes clients, notre magazinier aimerait avoir un état des stocke au jour le jour... Voyons cela en détail...
Les tables de notre jeu d'essai :

 
Sélectionnez
CREATE TABLE T_RECEPTION_RCP
(PRD_ID       INT,
 RCP_DATE     DATE, 
 RCP_QUANTITE FLOAT) ;

CREATE TABLE T_COMMANDE_CMD 
(PRD_ID        INT,
 CMD_DATE      DATE,
 CMD_QUANTITE  INT) ;
 
Sélectionnez
INSERT INTO T_RECEPTION_RCP VALUES (1, '2008-01-01', 10) ;
INSERT INTO T_RECEPTION_RCP VALUES (1, '2008-02-01', 20) ;
INSERT INTO T_RECEPTION_RCP VALUES (1, '2008-03-15',  5) ;
INSERT INTO T_RECEPTION_RCP VALUES (2, '2008-02-10', 20) ;
INSERT INTO T_RECEPTION_RCP VALUES (2, '2008-03-20', 25) ;
INSERT INTO T_RECEPTION_RCP VALUES (3, '2008-01-12', 20) ;
INSERT INTO T_RECEPTION_RCP VALUES (4, '2008-01-01', 10) ;
INSERT INTO T_RECEPTION_RCP VALUES (4, '2008-01-15', 20) ;
INSERT INTO T_RECEPTION_RCP VALUES (4, '2008-02-01', 30) ;

INSERT INTO T_COMMANDE_CMD VALUES (1, '2008-02-11', 45) ;
INSERT INTO T_COMMANDE_CMD VALUES (2, '2008-02-15', 35) ;
INSERT INTO T_COMMANDE_CMD VALUES (3, '2008-02-01'  20) ;
INSERT INTO T_COMMANDE_CMD VALUES (4, '2008-01-05'  75) ;

Les lignes de réception sont celles des produits alimentant le stock. Les lignes des commandes sont celles sortant du stock...
Notre magazinier aimerait obtenir la présentation suivante :

 
Sélectionnez
PRD_ID     DATE_STOCK     QTE_PRISE     QTE_RECUE     QTE_DISPO     RESTE_A_COMPLETER
---------- -------------- ------------- ------------- ------------- -----------------
1          2008-01-01     NULL          10            10            0
1          2008-02-01     NULL          20            20            0
1          2008-02-11     45            NULL          0             15
1          2008-03-15     NULL          5             0             10
2          2008-02-10     NULL          20            20            0
2          2008-02-15     35            NULL          0             15
2          2008-03-20     NULL          25            10            0
3          2008-01-12     NULL          20            20            0
3          2008-02-01     20            NULL          0             0
4          2008-01-01     NULL          10            10            0
4          2008-01-05     75            NULL          0             65 
4          2008-01-15     NULL          20            0             45
4          2008-02-01     NULL          30            0             15  

Qui lui permet de connaître au jour le jour ou il est est avec toutes les variations de stock.
Sauriez vous élaborer une telle requête ?

cliquez pour répondre et titrez votre mail " Problème n°40 - gestion des stocks "


précédentsommaire

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © SQLPro. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.