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 :
CREATE TABLE T_RENDEZ_VOUS_RDV
(RDV_DATE TIMESTAMP);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 :
RDV_DATE
-------------
2008-01-11Testez 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 :
CREATE TABLE T_PRIME_PRM
(PRM_EMPLOYE VARCHAR(16),
PRM_MONTANT DECIMAL(16,2),
PRN_NB_ECHEANCES INT);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 :
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.37A 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 :
compte ana montant
-------- -------- ------------
612000 26045 260.50
612000 12345 130.40
612101 33556 330.50
654000 26346 33.55
654102 28333 180.10compte ana nouvelle affectation
---------- -------- --------------------
6????? ????? T124
6????? ??5?? T028
6????? 26??? T033
612??? ????? T125
612??? ??5?? T126compte 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 :
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));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 :
CREATE TABLE T_LIGNE_PRECEDENTE
(COL VARCHAR(3));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 :
COL LIGNE_PRECEDENTE
---- ----------------
AAA NULL
BBB AAA
CCC BBB
DDD CCCD'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 :
JOR_ID JOR_NOM
------------- -----------
1 Dupont
2 Camus
3 MercierMCH_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 10JOR_ID JOR_NOM NB_MATCHS NB_VICTOIRES
------------- -------------- ------------- ---------------
1 Dupont 2 1
2 Camus 3 2
3 Mercier 3 1A vous de jouer !
Voici la défintion des tables et le jeu d'essais :
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);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 !
CREATE TABLE T_PARCELLE_PCL (PCL_NUM VARCHAR(16));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 :
PCL_NUM
----------------
1
2
3
11
21
22
111
221
28A
28Bcliquez 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 :
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 :
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 dû ê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...
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)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 :
CREATE TABLE T_GARDIENNAGE_GDN
(GDN_NOM VARCHAR(16),
GDN_DATEHEURE_DEBUT TIMESTAMP,
GDN_DATEHEURE_FIN TIMESTAMP) ;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...
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:30A 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 :
CREATE TABLE T_PAPIER_PPR
(PPR_TITRE VARCHAR(36),
PPR_ABSTRACT VARCHAR(120)) ;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 :
MOT_CLEF NOMBRE
------------------- ----------
Histoire 5
Politique 3
Guerre 2
Union européenne 1Sauriez-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 :
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) ;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 :
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 15Qui 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 "

