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
-
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 :
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
.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 :
compte ana montant
-------- -------- ------------
612000
26045
260
.50
612000
12345
130
.40
612101
33556
330
.50
654000
26346
33
.55
654102
28333
180
.10
compte ana nouvelle affectation
---------- -------- --------------------
6
????? ????? T124
6
????? ??5
?? T028
6
????? 26
??? T033
612
??? ????? T125
612
??? ??5
?? T126
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 :
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 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 :
JOR_ID JOR_NOM
------------- -----------
1
Dupont
2
Camus
3
Mercier
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
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 :
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
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 :
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
: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 :
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 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 :
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
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 "