ATTENTION : le contenu des ces pages web est soumis aux dispositions légales françaises et internationales en matière de droits d'auteurs et de copyright.

SQLpro, c'est aussi un expert langage SQL, SGBD relationnels, Microsoft SQL Server  à votre service :  
expertise,
audit, conseil, assistance, formation,
analyse, modélisation de données & développement... MVP SQL Server
   

Microsoft Most Valuable Professional


LE SQL de A à Z

EXERCICES ET TRAVAUX PRATIQUES (4eme partie) ...

Problèmes et exercices corrigés sur le langage SQL.

Voici une série de travaux pratiques sur le langage SQL appelant des réponses devant être écrites uniquement à partir de requêtes, en utilisant le plus souvent possible le jeu de commande du SQL 2 normalisé (1992). Les données de départ, comme la structure des tables en jeu et la réponse attendue sous la forme d'un jeu de résultat (table) sont donné dans chacun des énoncés 

Pour répondre à ces, questions, rien de plus simple : envoyez-moi vos solutions en utilisant le lien hypertexte ouvrant votre messagerie. Bien entendu, je vous répond personnellement et vous propose une correction didactique et pédagogique afin que vous compreniez le mécanisme de construction de la requête.

Voici donc une première série d'exercices numérotés de 31 à 40

 

dernière mise à jour : 

Courriel
Par Frédéric BROUARD
 
 

LES RÈGLES DU JEU

Pour répondre à la question posée il vous faut écrire une seule requête SQL. Vous avez le droit d'utiliser toutes les techniques disponibles dans SQL:2003 :

Vous pouvez utiliser toutes les opérations disponibles dans SQL, y compris les sous requêtes dans les clauses SELECT, FROM, WHERE et HAVING, et bien entendu les sous requêtes corrélées.

Vous pouvez ajoutez dans la base une ou plusieurs nouvelles tables et leurs données ou encore définir autant de vues que vous le voulez,pour concourrir à la solution. En revanche vous n'avez pas le droit d'utiliser une UDF (fonction utilisateur), ni une procédure stockée, ni un trigger, ni bien entendu modifier la ou les tables et les données à l'origine du problème.

Tous ces exercices ont une solution et souvent plusieurs !

Pour vous aider à répondre, nous vous donnons :

  1. la structure de la ou les tables sous la forme d'un ordre SQL CREATE TABLE...;
  2. les données à insérer sous la forme d'un jeu d'ordre SQL INSERT INTO...;
  3. le résultat attendu (lignes résultant de l'exécution de la requête solution);
  4. le niveau de difficulté noté avec des étoiles de 1 (facile) à 5 (très difficile);
  5. parfois une ébauche du résultat pour vous mettre sur la piste.

Pour savoir si votre solution est bonne, comme pour obtenir la solution, envoyez votre réponse ou votre demande par mail en précisant le titre ou le n° du problème.

 

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...

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

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 !


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

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  :

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 :

compte     ana      nouvelle affectation
---------- -------- --------------------
6?????     ?????    T124
6?????     ??5??    T028
6?????     26???    T033
612???     ?????    T125
612???     ??5??    T126
Résultat que l'on doit obtenir :

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));
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);
CREATE TABLE T_AFFECTATION_AFC
(AFC_COMPTE          CHAR(6),
 AFC_ANA             CHAR(5),
 AFC_AFFECT          CHAR(4));
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...

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


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 ?

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

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 JOR_ID        JOR_NOM
------------- -----------
1             Dupont
2             Camus
3             Mercier
TABLE T_MATCH_MCH
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 :
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));
INSERT INTO T_JOUEUR_JOR VALUES (1, 'Dupont');
INSERT INTO T_JOUEUR_JOR VALUES (2, 'Camus');
INSERT INTO T_JOUEUR_JOR VALUES (3, 'Mercier');
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_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);


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

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


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


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...

-- podiums corrects
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
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...


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



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 mourrons à se faire !


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




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 ?


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


Problème n° 40 -  gestion des stocks


Un problème bine 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)

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)
CREATE TABLE T_COMMANDE_CMD
(PRD_ID        INT,
 CMD_DATE      DATE,
 CMD_QUANTITE  INT)
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 ?


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