You are on page 1of 39

Le SQL de A Z

Exercices et travaux pratiques par SQLPro (autres articles) (Blog)


Date de publication : Dernire mise jour :

Problmes et exercices corrigs sur le langage SQL. Voici une srie de travaux pratiques sur le langage SQL appelant des rponses devant tre crites uniquement partir de requtes, en utilisant le plus souvent possible le jeu de commande du SQL 2 normalis (1999 ou 2003). Les donnes de dpart, comme la structure des tables en jeu et la rponse attendue - sous la forme d'un jeu de rsultat (table) - sont donnes dans chacun des noncs. Pour rpondre ces, questions, rien de plus simple : envoyez-moi vos solutions en utilisant le lien hypertexte ouvrant votre messagerie. Bien entendu, je vous rpond personnellement et vous propose une correction didactique et pdagogique afin que vous compreniez le mcanisme de construction de la requte.

Le SQL de A Z par SQLPro (autres articles) (Blog)

I - Les rgles du jeu.................................................................................................................................................... 3 II - Exercices - 1 partie.............................................................................................................................................. 3 II-A - Problme n 1 - un dans dix ....................................................................................................................... 3 II-B - Problme n2 - le publipostage.................................................................................................................... 5 II-C - Problme n 3 - la date an 2000................................................................................................................. 5 II-D - Problme n 4 - les chambres libres............................................................................................................6 II-E - Problme n 5 - dates d'anniversaire........................................................................................................... 7 II-F - Problme n 6 - numration........................................................................................................................9 II-G - Problme n 7 - le comptage..................................................................................................................... 10 II-H - Problme n 8 - linarisation...................................................................................................................... 10 II-I - Problme n 9 - les trous.............................................................................................................................11 II-J - Problme n 10 - symtrie ngative............................................................................................................12 III - Exercices - 2 partie........................................................................................................................................... 13 III-A - Problme n 11 - premiers.........................................................................................................................13 III-B - Problme n 12 - la traduction.................................................................................................................. 14 III-C - Problme n 13 - scores........................................................................................................................... 15 III-D - Problme n 14 - tranches d'ge.............................................................................................................. 16 III-E - Problme n 15 - titres sans article........................................................................................................... 17 III-F - Problme n 16 - Tri des titres.................................................................................................................. 17 III-G - Problme n 17 - Appariement..................................................................................................................18 III-H - Problme n 18 - Meilleure correspondance.............................................................................................20 III-I - Problme n 19 - La mdiane.....................................................................................................................21 III-J - Problme n 20 - Insertion en bloc............................................................................................................ 22 IV - Exercices - 3 partie........................................................................................................................................... 23 IV-A - Problme n 21 - Ordonner, rordonner !................................................................................................. 23 IV-B - Problme n 22 - Jointure htrogne...................................................................................................... 24 IV-C - Problme n 23 - Insertion conditionnelle................................................................................................. 25 IV-D - Problme n 24 - Un arbre deux niveaux..............................................................................................26 IV-E - Problme n 25 - clater des lignes......................................................................................................... 26 IV-F - Problme n 26 - Noms incrments........................................................................................................ 28 IV-G - Problme n 27 - Une lettre un nom........................................................................................................ 28 IV-H - Problme n 28 - Filtrer les adresses IP.................................................................................................. 29 IV-I - Problme n 29 - Calculer l'adresses IP suivante...................................................................................... 30 IV-J - Problme n 30 - Nombre de jours contigus............................................................................................. 30 V - Exercices - 4 Partie........................................................................................................................................... 31 V-A - Problme n 31 - plus proche valeur......................................................................................................... 31 V-B - Problme n 32 - primes de salaires......................................................................................................... 32 V-C - Problme n 33 - affectations comptables................................................................................................. 32 V-D - Problme n 34 - prcdents (ou suivants)............................................................................................... 33 V-E - Problme n 35 - matchs et victoires.........................................................................................................34 V-F - Problme n 36 - tri btard.........................................................................................................................35 V-G - Problme n 37 - vote contraint.................................................................................................................35 V-H - Problme n 38 - proprit bien garde.................................................................................................... 36 V-I - Problme n 39 - abstract et mots clefs.....................................................................................................37 V-J - Problme n 40 - gestion des stocks.........................................................................................................38

-2Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog)

I - Les rgles du jeu


Pour rpondre la question pose, il vous faut crire une seule requte SQL. Vous avez le droit d'utiliser toutes les techniques disponibles dans SQL:2003 : Prdicats : BETWEEN, IN, IS NULL, IS TRUE, IS FALSE, IS UNKNOWN, ALL, ANY, SOME, EXISTS, UNIQUE, MATCH, LIKE, OVERLAPS... Mots clef : ALL, DISTINCT... Comparaisons : =, <=, >=, <, >, <>... Connecteurs logiques : AND, OR, NOT... Constructions : Row Value Constructor, CASE... Oprateurs : UNION, EXCEPT, INTERSECT... Fonctions : CAST, OCTET_LENGTH, BIT_LENGTH, COALESCE, NULLIF, CHARACTER_LENGTH, SUBSTRING, POSITION, TRIM, UPPER, LOWER, ABS, MOD, LN, EXP, POWER, FLOOR, CEILING, EXTRACT, CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP... Agrgats statistiques : COUNT(*), COUNT(...), MAX(...), MIN(...), SUM(...), AVG(...)... Clauses : WHERE, HAVING, GROUP BY, COLLATE, ORDER BY... Les jointures : INNER JOIN, LEFT, RIGHT ou FULL OUTER JOIN, CROSS JOIN, UNION JOIN Les agrgats cumulatifs CUBE, ROLLUP, GROUPING SETS et la fonction GROUPING (SQL:1999) Les fonctions de fentrage (RANK, DENSE_RANK, PERCENT_RANK, ROW_NUMBER, CUM_DIST et leurs clauses spcifiques : ORDER BY, PARTITION BY (SQL:2003) Les agrgats partiels obtenur avec les clauses ORDER BY, PARTITION BY (SQL:2003) la technique de la CTE (Common table expression - expression de table) dont vous trouverez une tude ici : CTE ET rcursivit des requtes

Vous pouvez utiliser toutes les oprations disponibles dans SQL, y compris les sous requtes dans les clauses SELECT, FROM, WHERE et HAVING, et bien entendu les sous requtes corrles. Vous pouvez ajoutez dans la base une ou plusieurs nouvelles tables et leurs donnes ou encore dfinir 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 procdure stocke, ni un trigger, ni bien entendu modifier la ou les tables et les donnes l'origine du problme. Tous ces exercices ont une solution et souvent plusieurs ! Pour vous aider rpondre, nous vous donnons : 1 2 3 4 5 la structure de la ou les tables sous la forme d'un ordre SQL CREATE TABLE...; les donnes insrer sous la forme d'un jeu d'ordre SQL INSERT INTO...; le rsultat attendu (lignes rsultant de l'excution de la requte solution); le niveau de difficult not avec des toiles de 1 (facile) 5 (trs difficile); parfois une bauche du rsultat pour vous mettre sur la piste. Pour savoir si votre solution est bonne, comme pour obtenir la solution, envoyez votre rponse ou votre demande par mail en prcisant le titre ou le n du problme.

II - Exercices - 1 partie II-A - Problme n 1 - un dans dix


Notre premier problme est intitul 'un dans dix' et il nous est pos par Joe CELKO... Une table est compose de 11 colonnes comme suit :
-3Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog)

Cration de la table

CREATE TABLE T_CELKO_TEN_IN_ON_TIO (TIO_ID INTEGER NOT NULL, TIO_1 INTEGER NOT NULL, TIO_2 INTEGER NOT NULL, TIO_3 INTEGER NOT NULL, TIO_4 INTEGER NOT NULL, TIO_5 INTEGER NOT NULL, TIO_6 INTEGER NOT NULL, TIO_7 INTEGER NOT NULL, TIO_8 INTEGER NOT NULL, TIO_9 INTEGER NOT NULL, TIO_10 INTEGER NOT NULL);

Insertion des donnes


INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO

T_CELKO_TEN_IN_ON_TIO T_CELKO_TEN_IN_ON_TIO T_CELKO_TEN_IN_ON_TIO T_CELKO_TEN_IN_ON_TIO T_CELKO_TEN_IN_ON_TIO T_CELKO_TEN_IN_ON_TIO T_CELKO_TEN_IN_ON_TIO T_CELKO_TEN_IN_ON_TIO T_CELKO_TEN_IN_ON_TIO T_CELKO_TEN_IN_ON_TIO T_CELKO_TEN_IN_ON_TIO T_CELKO_TEN_IN_ON_TIO

VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES

(1, (2, (3, (4, (5, (6, (7, (8, (9, (10, (11, (12,

0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1,

1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -2, 3, -4, 5, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, -1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,

0, 0, 0); 1, 0, 0); 7, -8, 5); 0, 9, 0); 0, 0, 0); 1, 0, 0); 0, 0, 1); 0, 0, 0); 0, 0, 0); 0, 0, 0); 1, 1, 1); 0, 0, -1);

Donnes de la table
TIO_ID -------1 2 3 4 5 6 7 8 9 10 11 12 TIO_1 -------0 0 0 0 0 0 0 1 0 0 1 1

TIO_2 -------1 0 1 0 0 0 1 0 0 0 1 0

TIO_3 -------1 0 -2 0 0 0 0 0 0 0 1 0

TIO_4 -------0 0 3 0 0 0 1 0 -1 0 1 0

TIO_5 -------0 0 -4 0 0 0 0 0 0 0 1 0

TIO_6 -------0 0 5 0 -1 -1 0 0 0 0 1 0

TIO_7 -------0 0 -6 0 1 1 0 0 0 0 1 0

TIO_8 -------0 1 7 0 0 1 0 0 0 0 1 0

TIO_9 -------0 0 -8 9 0 0 0 0 0 0 1 0

TIO_10 -------0 0 5 0 0 0 1 0 0 0 1 -1

Il semble que Joe, le concepteur de cette base de donnes veuille stocker des tableaux d'entiers 10 cellules. Le problme qui est soulev, c'est que notre quidam veut obtenir en une seule requte : 1 2 les lignes de la table dont toutes les cellules f1 f10 sont zro sauf une, les lignes de la table dont toutes les cellules f1 f10 sont zro sauf une value un.

Les rsultats attendus : Les lignes de la table dont toutes les cellules f1 f10 sont zro sauf une :
TIO_ID -------2 4 8 9 TIO_1 -------0 0 1 0 TIO_2 -------0 0 0 0 TIO_3 -------0 0 0 0 TIO_4 -------0 0 0 -1 TIO_5 -------0 0 0 0 TIO_6 -------0 0 0 0 TIO_7 -------0 0 0 0 TIO_8 -------1 0 0 0 TIO_9 -------0 9 0 0 TIO_10 -------0 0 0 0

Les lignes de la table dont toutes les cellules f1 f10 sont zro sauf une value un :
TIO_ID -------2 8 TIO_1 -------0 1 TIO_2 -------0 0 TIO_3 -------0 0 TIO_4 -------0 0 TIO_5 -------0 0 TIO_6 -------0 0 TIO_7 -------0 0

TIO_8 -------1 0

TIO_9 -------0 0

TIO_10 -------0 0

-4Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog)

Il existe de multiples solutions ce problme et j'en dcouvre une nouvelle tous les mois... A vous de jouer ! cliquez pour rpondre et titrez votre mail "Problme n 1 - un dans dix, ma solution"

II-B - Problme n2 - le publipostage


Notre second problme est intitul 'le publipostage' et il m'a t suggr par Larry DiGiovanni... Nous disposons d'une table contenant les noms et adresses de personnes (table PERSON) dot d'une colonne NOMBRE. Larry besoin de reproduire certaines lignes plusieurs fois afin de faire des tiquettes de publipostage. Ainsi pour Monsieur MARTIN il dsire 2 tiquettes, tandis que pour M. DUPOND il en faut trois. Ce nombre est saisie dans la table T_PERSONNE_PRS qui a la structure suivante :
CREATE TABLE T_PERSONNE_PRS (PRS_NOM CHAR(16) NOT NULL, PRS_VILLE CHAR(16), PRS_NOMBRE INTEGER); INSERT INTO T_PERSONNE_PRS VALUES ('MARTIN', 'PARIS', 3); INSERT INTO T_PERSONNE_PRS VALUES ('DUPOND', 'STRASBOURG', 2); PRS_NOM ---------MARTIN DUPOND PRS_VILLE -----------PARIS STRASBOURG PRS_NOMBRE ----------3 2

Le but tant de fournir une rponse dans laquelle chaque ligne de la table PERSON est recopi autant de fois que spcifi par la valeur de la colonne NOMBRE. Comment faire, en une requte et une seule, pour obtenir la rponse :
PRS_NOM ---------------MARTIN MARTIN MARTIN DUPOND DUPOND PRS_VILLE ---------------PARIS PARIS PARIS STRASBOURG STRASBOURG

Vous ne pouvez pas modifier la structure de la table ni modifier les donnes, mais vous avez le droit de vous aider en utilisant ou en crant d'autres lments dans la base de donnes... A vous de jouer ! cliquez pour rpondre et titrez votre mail "Problme n2 - le publipostage"

II-C - Problme n 3 - la date an 2000


Ce troisime problme "intitul date an 2000" est inspir des petits tracas que l'arrive de l'an 2000 a laiss nos dveloppeurs. La table comptable ci dessous comporte une colonne AMT_FIN qui indique la date de fin d'amortissement de certaines rfrences. Mais cette colonne est de type CHAR(6) et contient des donnes formate de la faon suivante : AAMMJJ (annes sur deux chiffres, mois sur deux chiffres, jour sur deux chiffres) afin de pouvoir trier facilement sur l'ordre alpha correspondant dans ce cas l'ordre calendaire.

-5Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog)

Notre dveloppeur a dcid d'ajouter une nouvelle colonne 'AMT_FIN_Y2K' de type CHAR(10) cette fois, et aimerais votre aide pour rtablir toutes les anciennes dates au bon format. Aucune date n'est antrieure au 1/1/1960. Sauriezvous l'aider ??? Je vous prcise que la date doit tre stocke dans cette base de donnes sous la forme AAAA-MM-JJ (format ISO). Voici un extrait des donnes de cette table intitul T_AMORTISSEMENT_AMT
CREATE TABLE T_AMORTISSEMENT_AMT (AMT_FIN CHAR(6), AMT_FIN_Y2K CHAR(10)); INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO T_AMORTISSEMENT_AMT T_AMORTISSEMENT_AMT T_AMORTISSEMENT_AMT T_AMORTISSEMENT_AMT T_AMORTISSEMENT_AMT (AMT_FIN) (AMT_FIN) (AMT_FIN) (AMT_FIN) (AMT_FIN) VALUES VALUES VALUES VALUES VALUES ('990601'); ('970201'); ('021201'); ('941101'); ('920715');

AMT_FIN ------990601 970201 021201 941101 920715

AMT_FIN_Y2K ---------NULL NULL NULL NULL NULL

Et voici le rsultat attendu :


AMT_FIN --------990601 970201 021201 941101 920715 AMT_FIN_Y2K ------------06-01-1999 02-01-1997 12-01-2002 11-01-1994 07-15-1992

cliquez pour rpondre et titrez votre mail "Problme n3 - la date an 2000"

II-D - Problme n 4 - les chambres libres


Ce problme "chambres libres" m'a t inspir par un internaute qui se posait la question suivante : "il me faut gerer les 350 jours de l'anne pour des rservations hotelires. Par exemple, il faudrait pouvoir afficher les chambres libre du 22/03/2000 au 15/04/2000" Notre internaute avait modlis cela dans deux tables : la table T_CHAMBRE_CHB, contenant, entre autres, le n des diffrentes chambres existantes et une table T_PLANNING_PLN contenant 3 colonnes, le numero de la chambre, la date et une colonne contenant une reprsentation boolenne pour indiquer que la chambre est libre ou non. L'htel de notre exemple comporte 4 chambres numrots de 1 4, et la table planning ne contient que des lignes pour les chambres rserves ou occupes. En principe, les chambres libres une date donnes ne sont pas reprsentes dans la table T_PLANNING_PLN, sauf si la colonne PLN_LIBRE est value True.
CREATE TABLE T_CHAMBRE_CHB (CHB_NUM INTEGER); CREATE TABLE T_PLANNING_PLN (PLN_JOUR DATE, CHB_NUM INTEGER, PLN_LIBRE CHAR(5)); INSERT INTO T_CHAMBRE_CHB VALUES (1) ; INSERT INTO T_CHAMBRE_CHB VALUES (2) ; INSERT INTO T_CHAMBRE_CHB VALUES (3) ; -6Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog) INSERT INTO T_CHAMBRE_CHB VALUES (4) ; INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO T_PLANNING_PLN T_PLANNING_PLN T_PLANNING_PLN T_PLANNING_PLN T_PLANNING_PLN VALUES VALUES VALUES VALUES VALUES ('2000-01-12', ('2000-01-12', ('2000-01-13', ('2000-01-13', ('2000-01-13', 1, 2, 1, 2, 4, 'False') 'False') 'False') 'False') 'True' ) ; ; ; ; ;

Sauriez-vous retrouver, l'aide d'une requte SQL de votre cru, 1) les chambres qui sont libre pendant toute la priode allant du 11 au 14 janvier 2000 ? 2) l'occupation des chambres pour la journe du 13 janvier 2000 ? 3) le planning des occupations pour toutes les chambres et toutes les dates du 11 au 14 janvier 2000 ? Les rponses attendues sont les suivantes : 1) Chambres libres priode du 11 au 14 janvier 2000
CHB_NUM ----------3 4

2) Occupation au 13 janvier 2000


CHB_NUM ----------1 2 3 4 PLN_LIBRE --------False False True True

3) Planning occupation des chambres du 11 au 14 janvier 2000 ?


CLD_JOUR ------------2000-01-11 2000-01-11 2000-01-11 2000-01-11 2000-01-12 2000-01-12 2000-01-12 2000-01-12 2000-01-13 2000-01-13 2000-01-13 2000-01-13 2000-01-14 2000-01-14 2000-01-14 2000-01-14 CHB_NUM ----------1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 PLN_LIBRE --------True True True True False False True True False False True True True True True True

cliquez pour rpondre et titrez votre mail "Problme n4 - les chambres libres"

II-E - Problme n 5 - dates d'anniversaire


Ce problme "date d'anniversaire" est venu de mon patron, qui m'a dit un jour, comme a, tout de go, "je voudrais envoyer une carte pour chacun de mes clients afin de lui souhiater un bon anniversaire..." Fastoche, me suis-je dis. Hlas, j'ai du piannoter un bon moment avant d'arriver trouver une solution honnte. Sauriez vous trouver aussi bien, sinon mieux encore que ce que j'ai fait ??? Voici un exemple de la table de nos clients :
CREATE TABLE T_CLIENT_CLI (CLI_ID INTEGER, CLI_NOM VARCHAR(16), -7Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog) CLI_DATE_NAISSANCE DATE); INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES (24, (25, (26, (27, (28, (29, (30, (31, (32, (33, (34, (35, (36, (37, (38, (39, (40, (41, (42, (44, (45, (46, 'HESS', 'CHATON', 'PLATONOFF', 'LETERRIER', 'MONTEIL', 'SPITHAKIS', 'ORELL', 'MARTINET', 'RAY', 'TARSAC', 'COULOMB', 'SAVY', 'DAVID', 'FORGEOT', 'BERGER', 'DOUBLET', 'MATHIEU', 'MOURGUES', 'PIERROT', 'ZAMPIERO', 'PASCOT', 'MECHRI', '1984-08-30') ; '1938-12-31') ; '1960-03-29') ; '1945-08-26') ; '1985-03-23') ; '1956-03-31') ; '1996-01-27') ; '1946-10-24') ; '1979-12-20') ; '1992-08-14') ; '1963-01-01') ; '1942-10-03') ; '1922-09-19') ; '1989-09-13') ; '1946-10-16') ; '1961-03-02') ; '1990-02-24') ; '1953-01-14') ; '1933-02-11') ; '1985-01-19') ; Null ) ; '1950-08-11');

CLI_ID ----------24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 44 45 46

CLI_NOM ---------------HESS CHATON PLATONOFF LETERRIER MONTEIL SPITHAKIS ORELL MARTINET RAY TARSAC COULOMB SAVY DAVID FORGEOT BERGER DOUBLET MATHIEU MOURGUES PIERROT ZAMPIERO PASCOT MECHRI

CLI_DATE_NAISSANCE -----------------1934-08-30 1938-12-31 1960-03-29 1945-08-26 1935-03-23 1956-03-31 1956-01-27 1946-10-24 1939-12-20 1942-08-14 1963-01-01 1942-10-03 1922-09-19 1949-09-13 1946-10-16 1961-03-02 1940-02-24 1953-01-14 1933-02-11 1945-01-19 NULL 1950-08-11

Le problme est, par exemple, d'extraire les clients qui vont avoir leur anniversaire entre : 1) le 21 fvrier et le 20 mars ; 2) le 21 dcembre au 20 janvier ; 3) n'importe quelle fourchette de date (mme cheval sur deux annes). Les rponses attendues sont les suivantes : 1) Anniversaires entre le 21 fvrier et le 20 mars
CLI_ID ----------39 40 CLI_NOM ---------------DOUBLET MATHIEU

CLI_DATE_NAISSANCE ----------1961-03-02 1940-02-24

2) Anniversaires entre le 21 dcembre et le 20 janvier


CLI_ID CLI_NOM CLI_DATE_NAISSANCE ----------- ---------------- -----------------25 CHATON 1938-12-31

-8Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog)

2) Anniversaires entre le 21 dcembre et le 20 janvier


34 41 44 COULOMB MOURGUES ZAMPIERO 1963-01-01 1953-01-14 1945-01-19

A vos requtes... cliquez pour rpondre et titrez votre mail "Problme n 5 - dates d'anniversaire"

II-F - Problme n 6 - numration


Pour cet exercice, il s'agit d'alimenter les nombres de 0 9999 dans une table de nom T_ENTIER_ENT contenant un seul champ de type entier et de nom ENT_N. Au dpart, cette table contient les nombres de 0 9. J'ai intitul ce problme, ' numration' ... La table T_ENTIER_NET est ainsi constitue :
CREATE TABLE T_ENTIER_ENT (ENT_N INTEGER); INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT ENT_N -----0 1 2 3 4 5 6 7 8 9 INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO T_ENTIER_ENT T_ENTIER_ENT T_ENTIER_ENT T_ENTIER_ENT T_ENTIER_ENT T_ENTIER_ENT T_ENTIER_ENT T_ENTIER_ENT T_ENTIER_ENT T_ENTIER_ENT VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES (0) (1) (2) (3) (4) (5) (6) (7) (8) (9) ; ; ; ; ; ; ; ; ; ;

Sauriez vous faire une telle requte avec un seul update ? Voici un extrait de la table des donnes insrer :
NOMBRE ----------10 11 12 13 14 ... 9995 9996 9997 9998 9999

cliquez pour rpondre et titrez votre mail " Problme n 6 - numration "
-9Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog)

II-G - Problme n 7 - le comptage


Voici un problme qui m'a t soumis par un collgue. Je l'ai intitul le comptage... Comment faire en sorte que l'on puisse gnrer une colonne de comptage allant de 1 n pour compter chaque occurence de la rponse ? C'est un problme rcurent. Beaucoup de dveloppeurs souhaitent numroter les lignes d'une table rponse. Dans notre exemple, mon collgue possde une table "T_PROSPECT_PSP", dans laquelle il y a des noms de personne (colonne PSP_NOM) et il voudrait faire en sorte que le rsultat de sa requte numrote les lignes dans l'aordre alphabtique des noms :
CREATE TABLE T_PROSPECT_PSP (PSP_NOM VARCHAR(16)); INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO T_PROSPECT_PSP T_PROSPECT_PSP T_PROSPECT_PSP T_PROSPECT_PSP T_PROSPECT_PSP T_PROSPECT_PSP T_PROSPECT_PSP VALUES VALUES VALUES VALUES VALUES VALUES VALUES ('ARMAND'); ('DUPONT'); ('BAILLE'); ('GAUTIER'); ('MARTIN'); ('CLAUDE'); ('DUPONT');

Avez-vous une ide pour traiter ce problme ? Voici le rsultat attendu :


PSP_NOM ---------------BAILLE CLAUDE DUPONT DUPONT GAUTIER MARTIN N ----------1 2 3 4 5 6

A vos requtes ! cliquez pour rpondre et titrez votre mail " Problme n 7 comptage "

II-H - Problme n 8 - linarisation


Nous apellerons ce problme " linarisation "... Opaz, un internaute me demande : " J'ai besoin d'un affichage en ligne plutot qu'en colonne. J'ai trois tables diffrentes et je souhaite simplement afficher le nombre de lignes de chacunes... Voici mes tables et les donnes ... "
CREATE TABLE TBL1 (TBL_ID INTEGER); CREATE TABLE TBL2 (TBL_ID INTEGER); CREATE TABLE TBL3 (TBL_ID INTEGER); INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO TBL1 TBL1 TBL1 TBL1 TBL1 VALUES VALUES VALUES VALUES VALUES (1); (3); (5); (7); (9);

- 10 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog)

INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT

INTO INTO INTO INTO INTO INTO INTO INTO INTO

TBL2 TBL2 TBL2 TBL2 TBL3 TBL3 TBL3 TBL3 TBL3

VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES

(2); (4); (6); (8); (1); (2); (3); (5); (7);

Cette faon de prsenter l'information ne lui va pas :


SELECT 'TBL1' AS "TABLE", FROM TBL1 UNION ALL SELECT 'TBL2' AS "TABLE", FROM TBL2 UNION ALL SELECT 'TBL3' AS "TABLE", FROM TBL3 TABLE ----TBL1 TBL2 TBL3 NB ----------5 4 5 COUNT(*) AS NB COUNT(*) AS NB COUNT(*) AS NB

Il veut le rsultat sous la forme suivante :


TBL1 TBL2 TBL3 ----- ------ -----5 4 5

Sauriez vous aider Opaz et prsenter ce ssulta en une seule requte ??? cliquez pour rpondre et titrez votre mail " Problme n8 - linarisation "

II-I - Problme n 9 - les trous


Voici un problme envoy par Guillaume, un internaute, je l'ai apell " Les Trous " ! " J'ai une table dont la clef primaire est un entier (non auto incrment). Je cherche une requte qui me donnerai le premier entier disponible dans la squence parmi ces clefs. Par exemple si la table contient les enregistrements dont les clefs sont 1, 2, 3, 5, 6, 8, 9, 10, 11, 12, 14, 15 suite divers ajouts et suppressions d'enregistrements, je veux que la requte me donne 4... ." Pour simplifier la demande de Guillaume, voici la table qui constitue le coeur de cet exercice :
CREATE TABLE T_NUMERO_NMR (NMR INTEGER); INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO T_NUMERO_NMR T_NUMERO_NMR T_NUMERO_NMR T_NUMERO_NMR T_NUMERO_NMR T_NUMERO_NMR T_NUMERO_NMR T_NUMERO_NMR T_NUMERO_NMR T_NUMERO_NMR T_NUMERO_NMR VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES (1); (2); (3); (5); (6); (8); (9); (10); (11); (12); (14);

- 11 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog) INSERT INTO T_NUMERO_NMR VALUES (15);

Je suppose que Guillaume veut grer les trous de clefs gnrs par les suppressions d'enregistrements afin d'en rcuprer la place... C'est en gnral une fort mauvaise ide. Mais sauriez vous quand mme dpanner Guillaume ? Donc rcuprer tous les trous ? En une seule requte videmment ! Voici une image du rsultat :
TROU ----------4 7 13

cliquez pour rpondre et titrez votre mail " Problme n9 - les trous "

II-J - Problme n 10 - symtrie ngative


C'est une collgue qui m'a pos ce problme ... que j'ai intitul symtrie ngative ! Dans une application comptable ma collgue avait besoin d'annuler logiquement des lignes de dtail lie une ligne matre, c'est dire contrepasser une criture. Comme un exemple vaut mieux qu'on long discours, nous prendrons une facture et les lignes affrentes la facture.
CREATE TABLE T_FACTURE_FAC (FAC_NUM INTEGER, FAC_DATE DATE); CREATE TABLE (LIF_NUM FAC_NUM LIF_ARTICLE LIF_MONTANT T_LIGNE_FACTURE_LIF INTEGER, INTEGER, VARCHAR(16), DECIMAL(16,2));

INSERT INTO T_FACTURE_FAC VALUES(56, '2001-08-11') ; INSERT INTO T_FACTURE_FAC VALUES(79, '2001-08-17') ; INSERT INTO T_FACTURE_FAC VALUES(101,'2001-09-01'); INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO T_LIGNE_FACTURE_LIF T_LIGNE_FACTURE_LIF T_LIGNE_FACTURE_LIF T_LIGNE_FACTURE_LIF T_LIGNE_FACTURE_LIF T_LIGNE_FACTURE_LIF T_LIGNE_FACTURE_LIF T_LIGNE_FACTURE_LIF T_LIGNE_FACTURE_LIF T_LIGNE_FACTURE_LIF T_LIGNE_FACTURE_LIF T_LIGNE_FACTURE_LIF FAC_DATE -----------2001-08-11 2001-08-17 2001-09-01 FAC_NUM ----------56 56 56 56 56 LIF_ARTICLE ---------------Cartable Crayons Trousse Feutres Ardoise LIF_MONTANT -----------------123.50 17.52 29.99 11.25 44.21 VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES (11, (13, (15, (16, (18, (19, (21, (22, (27, (28, (32, (33, 56, 'Cartable', 123.50) ; 56, 'Crayons', 17.52) ; 56, 'Trousse', 29.99) ; 56, 'Feutres', 11.25) ; 56, 'Ardoise', 44.21) ; 79, 'Cigarettes', 21.55) ; 79, 'Whisky', 147.65) ; 79, 'Petite pp', 12857.59) ; 101, 'Savon', 16.24) ; 101, 'Serviette', 45.00) ; 101, 'Shampoing', 44.22) ; 101, 'Bain moussant', 118.40);

FAC_NUM ----------56 79 101 LIF_NUM ----------11 13 15 16 18

- 12 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog) 19 21 22 27 28 32 33 79 79 79 101 101 101 101 Cigarettes Whisky Petite pp Savon Serviette Shampoing Bain moussant 21.55 147.65 12857.59 16.24 45.00 44.22 118.40

Mais voil... La facture n79 (lignes en gras) doit tre annule et pour ce faire, on doit recopier les lignes de la table T_LIGNE_FACTURE_LIF correspondant cette facture, tout en rpondant deux critres bien prcis : - la clef de ces nouvelles lignes doit tre ngative - l'ordre de ces nouvelles lignes doit tre le mme que les lignes d'origine... - les montants doivent tre ngatifs Sauriez vous alimenter ces nouvelles lignes et extraire le rsultat global comme ceci ?
FAC_NUM ----------56 56 56 56 56 79 79 79 79 79 79 101 101 101 101 LIF_ARTICLE ---------------Cartable Crayons Trousse Feutres Ardoise Cigarettes Cigarettes Whisky Whisky Petite pp Petite pp Savon Serviette Shampoing Bain moussant LIF_MONTANT -----------------123.50 17.52 29.99 11.25 44.21 21.55 -21.55 -147.65 147.65 12857.59 -12857.59 16.24 45.00 44.22 118.40

On constate que la clause de tri provoque l'apparition de la ligne de contrepassation d'criture juste aprs la ligne de l'criture comptable originale... A vous de jouer ! cliquez pour rpondre et titrez votre mail " Problme n10 - symtrie ngative "

III - Exercices - 2 partie III-A - Problme n 11 - premiers


En partant d'une simple table contenant les nombre de 0 10000, sauriez vous en une seule requte obtenir tous les nombres premiers entre 1 et 10000 ? Pour cela repartons de la table gnre l'exercice 6 :
CREATE TABLE T_ENTIER_ENT (ENT_N INTEGER); INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO T_ENTIER_ENT T_ENTIER_ENT T_ENTIER_ENT T_ENTIER_ENT T_ENTIER_ENT T_ENTIER_ENT T_ENTIER_ENT T_ENTIER_ENT VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES (0); (1); (2); (3); (4); (5); (6); (7);

- 13 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog) INSERT INTO T_ENTIER_ENT VALUES (8); INSERT INTO T_ENTIER_ENT VALUES (9); ... ENT_N -----0 1 2 3 4 5 6 7 8 9 ...

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 mme et 1. Ou plutt qu'un nombre qui n'est pas premier est divisible par un nombre compris entre 2 et luimme moins un... En l'occurrence, le rsultat doit tre le suivant :
ENT_N ----------0 1 2 3 5 7 11 13 17 19 23 29 31 ...

On pourra bien entendu disserter ternellement sur la fait que 0 est premier ou non ! Mais sauriez vous exprimer la solution en une seule requte ? cliquez pour rpondre et titrez votre mail " Problme n11 - premiers "

III-B - Problme n 12 - la traduction


Voici un problme intressant pour les utilisateurs d'applications multilingues. C'est nouveau un internaute, Sylvain qui m'a pos une colle ! Voici ce que Sylvain post : "Bonjour, j'ai une table avec trois colonnes : id, langue, titre avec comme cl (id, langue). Je voudrais faire une requte du genre :
SELECT titre, id, langue FROM matable WHERE "(langue='francais' ou alors langue='anglais' si n'existe pas en francais)"

En gros, je veux les rsultats, de prfrence en francais, mais si il n'y a pas de ligne pour le franais, alors je voudrais la ligne pour la langue anglaise." Est-ce possible ? Voici le jeu d'essais avec lequel j'ai travaill :
- 14 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog) CREATE TABLE (TDR_ID TDR_LANGUE TDR_LIBELLE INSERT INSERT INSERT INSERT INTO INTO INTO INTO T_TRADUCTION_TDR INTEGER, VARCHAR(8), VARCHAR(256)); VALUES VALUES VALUES VALUES (1, (1, (3, (4, 'Franais', 'Anglais', 'Franais', 'Anglais', 'Erreur irrcuprable'); 'Fatal error'); 'Disque satur'); 'Memory fault');

T_TRADUCTION_TDR T_TRADUCTION_TDR T_TRADUCTION_TDR T_TRADUCTION_TDR

Quelques-uns de mes collgues ont trouv d'lgantes solutions... Sauriez vous trouver au moins une faon de faire ? Voici en tout cas le rsultat attendu :
TDR_LIBELLE -------------------------Erreur irrcuprable Disque satur Memory fault TDR_ID ----------1 3 4 TDR_LANGUE ---------Franais Franais Anglais

A vos claviers ! cliquez pour rpondre et titrez votre mail " Problme n12 - traduction "

III-C - Problme n 13 - scores


La question vient d'un forum. tant anonyme, je vous la donne telle quelle : "Je fait un petit QCM sur internet et je cre 2 tables dans ma base de donnes. L'une de ces tables contient les informations sur les sonds (nom,prnom,etc..) ainsi que leurs rponses mes questions (table T_PANEL_PNL). L'autre table contient, elle, les rponses justes mes questions (T_REPONSES_RPS). J'aimerais savoir si il est possible l'aide de requtes de comparer ces 2 tables, c'est dire que j'aimerais comparer les rponses de mes sonds aux rponses justes afin de dterminer les scores..." Voici le jeu d'essais utilis :
CREATE TABLE T_PANEL_PNL (PNL_NOM VARCHAR(16), PNL_REPONSE1 INTEGER, PNL_REPONSE2 INTEGER, PNL_REPONSE3 INTEGER, PNL_REPONSE4 INTEGER, PNL_REPONSE5 INTEGER); CREATE TABLE T_REPONSES_RPS (RPS_REPONSE1 INTEGER, RPS_REPONSE2 INTEGER, RPS_REPONSE3 INTEGER, RPS_REPONSE4 INTEGER, RPS_REPONSE5 INTEGER); INSERT INTO T_PANEL_PNL VALUES ('Pierre', 1, 2, 3, 0, 0); INSERT INTO T_PANEL_PNL VALUES ('Paul', 1, 5, 3, 2, 1); INSERT INTO T_PANEL_PNL VALUES ('Jacques', 0, 3, 3, 2, 2); INSERT INTO T_REPONSES_RPS VALUES (1, 4, 3, 2, 1);

Sauriez vous trouver une rponse pour qu'en une seule requte apparaisse la rponse suivante :
PNL_NOM ---------------Paul Pierre BONNES_REPONSES --------------4 2

- 15 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog) Jacques 2

A vos claviers ! cliquez pour rpondre et titrez votre mail " Problme n13 - scores "

III-D - Problme n 14 - tranches d'ge


C'est encore un anonyme qui me pose une question sur le forum SQLpro... Bonjour, Sur une table comprenant une date de naissance, je cherche obtenir le nombre d'enregistrements dont les personnes ont de 1 jour 18 ans, de 18 40 ans et les plus de 40 ans. Qui peut m'indiquer la requte effectuer ? Reprenons les donnes de l'exercice 5 :
CREATE TABLE T_CLIENT_CLI (CLI_ID INTEGER, CLI_NOM VARCHAR(16), CLI_DATE_NAISSANCE DATE); INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI T_CLIENT_CLI VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES (24, (25, (26, (27, (28, (29, (30, (31, (32, (33, (34, (35, (36, (37, (38, (39, (40, (41, (42, (44, (45, (46, 'HESS', 'CHATON', 'PLATONOFF', 'LETERRIER', 'MONTEIL', 'SPITHAKIS', 'ORELL', 'MARTINET', 'RAY', 'TARSAC', 'COULOMB', 'SAVY', 'DAVID', 'FORGEOT', 'BERGER', 'DOUBLET', 'MATHIEU', 'MOURGUES', 'PIERROT', 'ZAMPIERO', 'PASCOT', 'MECHRI', '1984-08-30'); '1938-12-31'); '1960-03-29'); '1945-08-26'); '1985-03-23'); '1956-03-31'); '1996-01-27'); '1946-10-24'); '1979-12-20'); '1992-08-14'); '1963-01-01'); '1942-10-03'); '1922-09-19'); '1989-09-13'); '1946-10-16'); '1961-03-02'); '1990-02-24'); '1953-01-14'); '1933-02-11'); '1985-01-19'); Null ); '1950-08-11');

CLI_ID ----------24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

CLI_NOM ---------------HESS CHATON PLATONOFF LETERRIER MONTEIL SPITHAKIS ORELL MARTINET RAY TARSAC COULOMB SAVY DAVID FORGEOT BERGER DOUBLET MATHIEU MOURGUES PIERROT

CLI_DATE_NAISSANCE -----------------1934-08-30 1938-12-31 1960-03-29 1945-08-26 1935-03-23 1956-03-31 1956-01-27 1946-10-24 1939-12-20 1942-08-14 1963-01-01 1942-10-03 1922-09-19 1949-09-13 1946-10-16 1961-03-02 1940-02-24 1953-01-14 1933-02-11

- 16 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog) 44 45 46 ZAMPIERO PASCOT MECHRI 1945-01-19 NULL 1950-08-11

Le rsultat de votre requte doit apparatre comme suit :


TRANCHE_MIN ----------0 18 40 TRANCHE_MAX ----------18 40 9999 NOMBRE ----------6 4 13

Sauriez vous rpondre notre internaute et de faon gnrique, c'est dire quelle que soit les futures tranches d'ge grer ? cliquez pour rpondre et titrez votre mail " Problme n14 - tranches d'age "

III-E - Problme n 15 - titres sans article


Dans les titres des livres (comme dans les titres des films) il y a souvent un article (le, la les, un, une, des...) situ en tte qui parasite l'apparition des oeuvres dans l'ordre alphabtique. D'ou la question de notre internaute, "Bouchon", son nom de code sur le forum SQL de www.developpez.com, qui demande : "J'aimerais, s'il y a un article au dbut du titre ("LE","LA","L'"), que celui-ci soit retir de la chaine et se retrouve la fin de celle-ci et entre parenthses." Voici notre jeu d'essais :
CREATE TABLE T_OUVRAGES_OVG (OVG_TITRE VARCHAR(64)); INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO T_OUVRAGES_OVG T_OUVRAGES_OVG T_OUVRAGES_OVG T_OUVRAGES_OVG T_OUVRAGES_OVG T_OUVRAGES_OVG VALUES VALUES VALUES VALUES VALUES VALUES ('Le journal de Raymond'); ('Le vlo d''Alphonse'); ('Dcouvrir l''escalade'); ('L''ge du capitaine'); ('Comment dvisser la vis'); ('D''amour et d''eau fraiche');

SELECT TITRES FROM OUVRAGES TITRE ---------------------------------Le journal de Raymond Le vlo d'Alphonse Dcouvrir l'escalade L'ge du capitaine Comment dvisser la vis D'amour et d'eau fraiche

Contenu de la table

??? TITRE ---------------------------------journal de Raymond (Le) vlo d'Alphonse (Le) Dcouvrir l'escalade ge du capitaine (L') Comment dvisser la vis amour et d'eau fraiche (D')

Rsultat attendu

Une colle finalement assez facile. Je l'ai rsolue en 10 minutes... Sauriez vous tre aussi performant que moi ??? Sauriez vous rpondre notre internaute ? cliquez pour rpondre et titrez votre mail " Problme n15 - titres sans article "

III-F - Problme n 16 - Tri des titres


Voici encore un problme de tri... Il m'a t pos par un internaute sur le forum SQL de www.developpez.com. Il pourrait tre le suite de notre exercice prcdent. Notre internaute voulait trier les titres de ses livres par ordre aplhabtique et laisser tous ceux qui ne commenent pas par une lettre la fin. Mais en plus il exige que les titres commenant par un chiffre soient positionns par rapport
- 17 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog)

leur criture en lettre... Autrement dit "2001 l'odysse de l'espace', doit figurer aprs "Ben Hur" et avant "Double assassinat dans la rue morgue. Sauriez vous lui rpondre ? Exemple :
CREATE TABLE T_LIVRE_LVR (LVR_TITRE VARCHAR(64)); INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO T_LIVRE_LVR T_LIVRE_LVR T_LIVRE_LVR T_LIVRE_LVR T_LIVRE_LVR T_LIVRE_LVR VALUES VALUES VALUES VALUES VALUES VALUES (' la recherche du temps perdu'); ('La bible') ; ('2001 l''odysse de l''espace'); ('Ben Hur'); ('Double assassinat dans la rue morgue'); ('Les trois mousquetaires');

Si vous avez brillament rpondu notre prcdent puzzle, alors vous devriez solutionner celui l ! Voici le rsultat attendu :
LVR_TITRE --------------------------------------------------------------- la recherche du temps perdu Ben Hur 2001 l'odysse de l'espace Double assassinat dans la rue morgue La bible Les trois mousquetaires

cliquez pour rpondre et titrez votre mail " Problme n16 - tri des titres "

III-G - Problme n 17 - Appariement


Le terme appariement vient de mettre en paires, c'est dire apparier. On dit appariement et et non apparition comme s'il s'agissait de fantme par exemple... Cette demande, qui m'a donn du fil retordre, provient du forum SQL du site www.developpez.com que j'anime. Il s'agit de rcuprer les valeurs de la colonne A pour laquelle les donnes de la colonne B sont exactement les mmes qu'une autre valeur de la colonne A.
CREATE TABLE T_PAIRE_PER (PER_1 CHAR(2), PER_2 CHAR(2)); INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO T_PAIRE_PER T_PAIRE_PER T_PAIRE_PER T_PAIRE_PER T_PAIRE_PER T_PAIRE_PER T_PAIRE_PER T_PAIRE_PER T_PAIRE_PER T_PAIRE_PER T_PAIRE_PER T_PAIRE_PER T_PAIRE_PER T_PAIRE_PER T_PAIRE_PER T_PAIRE_PER T_PAIRE_PER T_PAIRE_PER T_PAIRE_PER VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES ('A1', ('A1', ('A2', ('A2', ('A3', ('A3', ('A3', ('A3', ('A4', ('A4', ('A5', ('A6', ('A6', ('A6', ('A6', ('A8', ('A8', ('A8', ('A8', 'B1'); 'B2'); 'B1'); 'B3'); 'B1'); 'B3'); 'B7'); 'B4'); 'B1'); 'B3'); 'B2'); 'B1'); 'B4'); 'B7'); 'B3'); 'B1'); 'B4'); 'B7'); 'B3');

- 18 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog) INSERT INSERT INSERT INSERT INTO INTO INTO INTO T_PAIRE_PER T_PAIRE_PER T_PAIRE_PER T_PAIRE_PER VALUES VALUES VALUES VALUES ('A9', ('A9', ('A9', ('A9', 'B1'); 'B4'); 'B8'); 'B3');

Pour bien comprendre le problme, nous allons analyser ensemble les deux premires valeurs de la colonne A. Dmarrons avec la valeur 'A1' de la colonne PER_1 :
PER_1 ----A1 A1 A2 A2 A3 A3 A3 A3 A4 A4 A5 A6 A6 A6 A6 A8 A8 A8 A8 A9 A9 A9 A9 PER_2 ----B1 B2 B1 B3 B1 B3 B7 B4 B1 B3 B2 B1 B4 B7 B3 B1 B4 B7 B3 B1 B4 B8 B3 PER_1 ----A1 A1 A2 A2 A3 A3 A3 A3 A4 A4 A5 A6 A6 A6 A6 A8 A8 A8 A8 A9 A9 A9 A9 PER_2 ----B1 B2 B1 B3 B1 B3 B7 B4 B1 B3 B2 B1 B4 B7 B3 B1 B4 B7 B3 B1 B4 B8 B3

Pour la valeur 'A1' de la colonne PER_1, la colonne PER_2 possde les valeurs : 'B1' et 'B2'. Quelles sont les autres valeurs de PER_1 qui ont en regard les valeurs 'B1' et 'B2' dans la colonne PER_2 ?

Aucune autre valeur de PER_1 n'a simultanment les valeurs 'B1' et 'B2' dans la colonne PER_2

Analysons maintenant la valeur 'A2' de la colonne PER_1 :


PER_1 ----A1 A1 A2 A2 A3 A3 A3 A3 A4 A4 A5 A6 A6 A6 A6 PER_2 ----B1 B2 B1 B3 B1 B3 B7 B4 B1 B3 B2 B1 B4 B7 B3 PER_1 ----A1 A1 A2 A2 A3 A3 A3 A3 A4 A4 A5 A6 PER_2 ----B1 B2 B1 B3 B1 B3 B7 B4 B1 B3 B2 B1

- 19 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog) A8 A8 A8 A8 A9 A9 A9 A9 B1 B4 B7 B3 B1 B4 B8 B3 A6 A6 A6 A8 A8 A8 A8 A9 A9 A9 A9 B4 B7 B3 B1 B4 B7 B3 B1 B4 B8 B3

Pour la valeur 'A2' de la colonne PER_1, la colonne PER_2 possde les valeurs : 'B1' et 'B3'. Quelles sont les autres valeurs de PER_1 qui ont en regard les valeurs 'B1' et 'B3' dans la colonne PER_2 ?

'A3', 'A4', 'A6', 'A8' et 'A9' ont simultanment les valeurs 'B1' et 'B3' dans la colonne PER_2 mais certaines occurrences ('A3', 'A6', 'A8' et 'A9') ont en sus d'autres valeurs... Seule la valeur A4 est donc retenir.

Ici les seuls rsulats valables sont 'A2' avec 'A4', puis 'A3' avec 'A6' et 'A8'. En effet les donnes de la colonne PER_2 sont identiques pour 'A2' et 'A4' ('B1' et 'B3'). Les donnes de la colonne B sont aussi identiques pour 'A3', 'A6' et 'A8', (' B1', 'B3', 'B4', 'B7'). Le rsultat doit donc tre :
PER_1 ----A2 A3 A4 A6 A8

Simple en apparence, ce problme s'avre en fin de compte assez complexe. Mais j'ai dj commenc le travail de dcortication pour vous mettre sur la voie... cliquez pour rpondre et titrez votre mail " Problme n17 - appariement "

III-H - Problme n 18 - Meilleure correspondance


Voici une question qui m'a t pose sur le forum SQL de www.developpez.com par neness... Je possde une table T_ROUTE_RTE ainsi remplie :
CREATE TABLE T_ROUTE_RTE (RTE_DESTINATION VARCHAR(32), RTE_CODE CHAR(16)); INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO T_ROUTE_RTE T_ROUTE_RTE T_ROUTE_RTE T_ROUTE_RTE T_ROUTE_RTE T_ROUTE_RTE VALUES VALUES VALUES VALUES VALUES VALUES ('albania-Mobile', ('albania-Mobile', ('albania-Mobile', ('SFR-Mobile', ('SFR-Mobile', ('BOUYGE_TEL', '0035538'); '0035569'); '0035560'); '0077280'); '0077390'); '0078452');

- 20 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog)

Pour chaque RTE_DESTINATION, je recherche la partie de la colonne RTE_CODE dont les donnes sont communes dans le sens de lecture. Notre quidam essaye donc de trouver les meilleures correspondances partielles de RTE_CODE communes une mme famille de RTE_DESTINATION. Notez qu'il s'agit d'ailleurs d'une opration proche d'un calcul d'agrgat... Dans l'exemple donn, la requte doit renvoyer :
RTE_DESTINATION -------------------albania-Mobile BOUYGE_TEL SFR-Mobile RTE_CODE --------------00355 0078452 0077

En effet, '00355' est la plus grande partie commune commenant chaque RTE_CODE pour 'albania-Mobile', de mme '0078452' pour 'BOUYGE_TEL' et de mme '0077' pour 'SFR-Mobile'. Autrementy dit, quelle est la partie de RTE_DESTINATION correspondant aux premiers caractres communs chaque occurence de la colonne RTE_CODE. Simple, mais comment faire ? cliquez pour rpondre et titrez votre mail " Problme n18 meilleure correspondance "

III-I - Problme n 19 - La mdiane


Dans un forum consacr SQL Server de Microsoft, j'ai trouv cette question forte intressante : Bonjour, Je doit calculer des donnes statistiques et la mdiane est absente... Comment cela peut il tre ralis en une requte ?. Comme ce problme s'avre en dfinitif assez complexe, le voici exprims pour diffrents cas... 1) les donnes calcules sont toutes diffrentes (il n'y a pas de doublon) et en nombre impaires : Voici le jeu de donnes que j'ai utilis pour ce cas :
CREATE TABLE T_STATISTIQUES_STT (STT_ID INT, STT_VALEUR FLOAT NOT NULL); INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO T_STATISTIQUES_STT T_STATISTIQUES_STT T_STATISTIQUES_STT T_STATISTIQUES_STT T_STATISTIQUES_STT VALUES VALUES VALUES VALUES VALUES (1, (2, (3, (4, (5, 22.0); 27.5); 22.5); 24.0); 23.0);

La solution tant :
STT_VALEUR ---------23.0

2) les donnes calcules sont toutes diffrentes (il n'y a pas de doublon) et en nombre paires : Rajoutons au jeu prcdent la ligne :
INSERT INTO T_STATISTIQUES_STT VALUES (6, 23.5);

La solution devient :
- 21 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog) STT_VALEUR ---------23.25

3) voyons ce qu'il se passe avec des valeurs identiques multiples et un nombre de lignes impair : Rajoutons au jeu prcdent les lignes :
INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO T_STATISTIQUES_STT T_STATISTIQUES_STT T_STATISTIQUES_STT T_STATISTIQUES_STT T_STATISTIQUES_STT VALUES VALUES VALUES VALUES VALUES (7, 22.0); (8, 22.0); (9, 22.0); (10, 22.0); (11, 22.0);

La solution devient :
STT_VALEUR ---------22.0

C'est le genre de problme qui a passionn les spcialistes de SQL que sont Joe Celko et Chris Date. Sauriez vous au moins traiter le cas n 1 ? cliquez pour rpondre et titrez votre mail " Problme n19 - mediane "

III-J - Problme n 20 - Insertion en bloc


Voici un problme intressant pour s'affanchir de certaines procdures stockes btes et mchante...Comment insrer de multiple ligne, par exemple dans une table de jointure, sans faire appel une boucle et l'aide d'une seule et unique requte ? Notre problme est le suivant. Soit une table d'objets dfinie comme suit :
CREATE TABLE T_OBJET_OBJ (OBJ_OBJET VARCHAR(16)); INSERT INTO T_OBJET_OBJ VALUES ('feu tricolore'); INSERT INTO T_OBJET_OBJ VALUES ('drapeau franais');

... une table listant des couleurs :


CREATE TABLE T_COULEUR_CLR (CLR_COULEUR VARCHAR(8)); INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO T_COULEUR_CLR T_COULEUR_CLR T_COULEUR_CLR T_COULEUR_CLR T_COULEUR_CLR VALUES VALUES VALUES VALUES VALUES ('blanc'); ('bleu'); ('vert'); ('rouge'); ('orange');

... et une table de jointure associant les deux, table actuellement vide :
CREATE TABLE T_OBJET_COULEUR_OBC (OBJ_OBJET VARCHAR(16), CLR_COULEUR VARCHAR(8));

Nous aimerions parvenir remplir de la sorte la table d'association T_OBJET_COULEUR_OBC :

- 22 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog) OBJ_OBJET ---------------feu tricolore feu tricolore feu tricolore drapeau franais drapeau franais drapeau franais CLR_COULEUR ----------vert rouge orange blanc bleu rouge

Sauriez-vous trouver en une seule requte comment procder l'insertion massive de ces six lignes ? cliquez pour rpondre et titrez votre mail " Problme n20 - insertion en bloc "

IV - Exercices - 3 partie IV-A - Problme n 21 - Ordonner, rordonner !


Un problme d'ordonnancement avec SQL m'a t propos par Mouse sur le forum SQL de developpez. Il s'agit de modifier une colonne d'une table assurant l'ordonnacement des donnes de la table. Par exemple, la colonne position est numrote de 1 5 et l'on dsire remplacer la valeur 4 par la valeur 2 tout en prservant la continuit de l'ordre de 1 5... Un petit exemple permettra de mieux comprendre la chose... Voici une table de pays. La colonne position indique la position que le pays obtiendra dans la liste une fois quelle sera trie.
CREATE TABLE T_PAYS_PAY (PAY_NOM VARCHAR(16), PAY_POSITION INTEGER); INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO T_PAYS_PAY T_PAYS_PAY T_PAYS_PAY T_PAYS_PAY T_PAYS_PAY T_PAYS_PAY VALUES VALUES VALUES VALUES VALUES VALUES ('Allemagne', 1); ('Belgique', 2); ('Croatie', 3); ('Espagne', 4); ('France', 5); ('Grce', 6);

SELECT * FROM T_PAYS_PAY; PAY_NOM ---------------Allemagne Belgique Croatie Espagne France Grce PAY_POSITION -----------1 2 3 4 5 6

Notre utilisateur cherche recombiner l'ordre de la liste en faisant passer la France en tte, sans pour autant bousculer l'ordre des autres pays. Tant est si bien que finalement, aprs cette requte de mise jour, la table doit apparatre comme ceci :
PAY_NOM ---------------Allemagne Belgique Croatie Espagne France Grce PAY_POSITION -----------2 3 4 5 1 6

1) Sauriez-vous faire cela en une seule requte ?


- 23 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog)

2) Pourriez-vous proposer une solution gnrique pour cette permutation d'ordre de tri ? Nous allons corser le problme en admettant que la colonne PAY_POSITION puisse prendre des valeurs non continues : Voici donc les nouvelles conditions du jeu d'essai :
DELETE FROM T_PAYS_PAY; INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO T_PAYS_PAY T_PAYS_PAY T_PAYS_PAY T_PAYS_PAY T_PAYS_PAY T_PAYS_PAY VALUES VALUES VALUES VALUES VALUES VALUES ('Allemagne', 11); ('Belgique', 8); ('Croatie', 9); ('Espagne', 5); ('France', 12); ('Grce', 7);

PAY_NOM ---------------Espagne Grce Belgique Croatie Allemagne France

PAY_POSITION -----------5 7 8 9 11 12

3) Sauriez-vous renumroter les positions en continuit de 1 n (n tant le nombre de lignes dans la table) quelque soit les donnes de la colonne position, mais en gardant toujours le mme ordre... ? Et, en partant des donnes ci dessus, obtenir le rsultat suivant :
PAY_NOM ---------------Espagne Grce Belgique Croatie Allemagne France PAY_POSITION -----------1 2 3 4 5 6

A vos claviers... cliquez pour rpondre et titrez votre mail "Problme n21 - Ordonner, rordonner"

IV-B - Problme n 22 - Jointure htrogne


Voici un internaute qui a hrit d'un modle particulirement mal modlis. En effet, dans l'une des colonnes de la premire table ("public") on trouve toutes les donnes relatives aux rfrences de l'autres tables sous la forme suivante : [clef1].[clef2].[clef3]... Problme... comment raliser une requte qui fait la jointure entre ces deux tables ? Voici le jeu d'essais de notre internaute :
CREATE TABLE T_PUBLIC_PBL (PBL_ID INTEGER, PBL_NOM VARCHAR(16)); CREATE TABLE (PST_ID PST_LIBELLE PST_PUBLIC T_PRESTATION_PST INTEGER, VARCHAR(25), VARCHAR(32));

INSERT INTO T_PUBLIC_PBL VALUES (1, 'particulier'); INSERT INTO T_PUBLIC_PBL VALUES (3, 'entreprise'); INSERT INTO T_PUBLIC_PBL VALUES (2, 'groupe');

- 24 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog) INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO T_PRESTATION_PST T_PRESTATION_PST T_PRESTATION_PST T_PRESTATION_PST T_PRESTATION_PST VALUES VALUES VALUES VALUES VALUES (1, (2, (3, (4, (5, 'Tour en voiture', 'Comptition plusieurs', 'Course d''endurance ', 'Bapteme ', 'Course en tandem ', '[3]'); '[3].[2]'); '[1].[2]'); '[1]'); '[2]');

Il modlise des prestations sportives en visant diffrents publics. Les donnes sont donc les suivantes :
SELECT * FROM T_PUBLIC_PBL PBL_ID PBL_NOM ----------- ---------------1 particulier 3 entreprise 2 groupe

SELECT * FROM T_PRESTATION_PST PST_ID PST_LIBELLE PST_PUBLIC ----------- ------------------------- ---------------------1 Tour en voiture [3] 2 Comptition plusieurs [3].[2] 3 Course d'endurance [1].[2] 4 Bapteme [1] 5 Course en tandem [2]

Et notre internaute voudrait raliser la jointure entre la colonne PBL_ID de la table T_PUBLIC_PBL et chacune des valeurs situes entre crochets de la colonne PST_PUBLIC de la table T_PRESTATION_PST., Bref, en une requte sauriez vous afficher les donnes comme ceci :
PBL_ID ----------3 2 3 1 2 1 2 PBL_NOM ------------entreprise groupe entreprise particulier groupe particulier groupe PST_ID -----------1 2 2 3 3 4 5 PST_LIBELLE ------------------------Tour en voiture Comptition plusieurs Comptition plusieurs Course d'endurance Course d'endurance Bapteme Course en tandem PST_PUBLIC ---------------[3] [3].[2] [3].[2] [1].[2] [1].[2] [1] [2]

cliquez pour rpondre et titrez votre mail "Problme n22 - Jointure htrogne"

IV-C - Problme n 23 - Insertion conditionnelle


En voil une question intressante : comment insrer une ligne dans une table, uniquement si elle n'y est pas dj ? Autrement dit il me faut une requte capable d'insrer la ligne si elle n'existe pas, sinon, de ne pas procder l'insertion... Pour mieux comprendre la chose voici le modle de donnes et les diffrents jeu d'essais.
CREATE TABLE MATABLE ( COL1 INTEGER, COL2 VARCHAR(16)) ; INSERT INTO MATABLE VALUES (1, 'toto') ; INSERT INTO MATABLE VALUES (1, 'titi') ;

Pourriez-vous : 1) crer une requte INSERT dans cette table avec les valeurs 1, toto et faire en sorte que rien ne soit insr sans gnrer d'erreur ? 2) insrer 3, tutu avec cette mme requte ?? cliquez pour rpondre et titrez votre mail "Problme n23 - Insertion conditionnelle"

- 25 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog)

IV-D - Problme n 24 - Un arbre deux niveaux


Post par the tigrou...,dans le forum SQL de developpez : Je dois crire des requtes qui font appel des lignes appartenant des tables differentes. Par exemple une table "liste entreprise" et une table "liste salari". Comment selectionner les salaris de chaque entreprise de faon a faire une arboresence deux niveaux ? Pour vous aider, voici le jeu d'essais concoct par mes soins :
CREATE TABLE T_ENTREPRISE_ETP (ETP_ID INTEGER NOT NULL PRIMARY KEY, ETP_NOM VARCHAR(16)) ; CREATE TABLE T_EMPLOYEE_EMP (EMP_ID INTEGER NOT NULL PRIMARY KEY, EMP_NOM VARCHAR(16), ETP_ID INTEGER NOT NULL FOREIGN KEY REFERENCES T_ENTREPRISE_ETP (ETP_ID)) ; INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INSERT VALUES INTO T_ENTREPRISE_ETP (1, 'IBM') ; INTO T_ENTREPRISE_ETP (2, 'EDF') ; INTO T_EMPLOYEE_EMP (1, 'Durand', 1) ; INTO T_EMPLOYEE_EMP (2, 'Dupont', 1) ; INTO T_EMPLOYEE_EMP (3, 'Dubois', 1) ; INTO T_EMPLOYEE_EMP (4, 'Duval', 1) ; INTO T_EMPLOYEE_EMP (5, 'Dupond', 2) ; INTO T_EMPLOYEE_EMP (6, 'Duhamel', 2) ; INTO T_EMPLOYEE_EMP (7, 'Dufour', 2) ;

Ce qui Tigrou voudrait, doit se prsenter comme ceci :


NOM ----------------IBM Durand Dupont Dubois Duval EDF Dupond Duhamel Dufour

A vous de jouer ! cliquez pour rpondre et titrez votre mail "Problme n24 - Arbre deux niveaux"

IV-E - Problme n 25 - clater des lignes


C'est un de mes clients qui m'a mis au dfi de trouver comment raliser cette transformation... Partant d'une table de "LIGNE" ainsi modlise et des donnes suivantes :
CREATE TABLE LIGNE (ID_LIGNE INTEGER, - 26 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog) ID_REF INTEGER, QUANTITE INTEGER); INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO LIGNE LIGNE LIGNE LIGNE LIGNE LIGNE (ID_LIGNE, (ID_LIGNE, (ID_LIGNE, (ID_LIGNE, (ID_LIGNE, (ID_LIGNE, ID_REF, ID_REF, ID_REF, ID_REF, ID_REF, ID_REF, QUANTITE) QUANTITE) QUANTITE) QUANTITE) QUANTITE) QUANTITE) VALUES VALUES VALUES VALUES VALUES VALUES (1, (2, (3, (4, (5, (6, 1, 2, 3, 1, 2, 4, 4); 1); 2); 1); 2); 2);

Que l'on prsentera mieux sous sa forme extraite :


SELECT * FROM LIGNE ORDER BY ID_REF ; ID_LIGNE ----------1 4 5 2 3 6 ID_REF ----------1 1 2 2 3 4 QUANTITE ----------4 1 2 1 2 2

Auriez-vous l'amabilit de produire la table suivante :


ID_ARTICLE ----------1 2 3 4 5 6 7 8 9 10 11 12 ID_REF ----------1 1 1 1 1 2 2 2 3 3 4 4 SERIE ----------1 2 3 4 5 1 2 3 1 2 1 2 ID_LIGNE ----------1 1 1 1 4 2 5 5 3 3 6 6

Observez bien la manire dont est construite cette table rponse : SERIE est un incrment dpendant uniquement de ID_REF, avec comme particularit qu'il doit clater et numroter l'intrieur d'un mme ID_REF et dans l'ordre ID_LIGNE, des lignes dont le nombre figure dans QUANTITE. Autrement dit si pour ID_REF = 1, QUANTITE = 4, il y aura 4 lignes avec ce mme ID_REF. Si pour ce mme ID_REF de 1 il y a une ID_LIGNE diffrente, alors la numrotation doit de poursuivre en squence... Voici une prsentation qui met en correspondance les lignes de la table sources avec la table rponse :
ID_REF ----------1 1 1 1 1 2 2 2 3 3 4 4 ID_LIGNE ----------1 1 1 1 4 2 5 5 3 3 6 6 QUANTITE ----------4 4 4 4 1 1 2 2 2 2 2 2 ID_REF ID_ARTICLE ----------1 1 1 1 1 2 2 2 3 3 10 4 11 ID_LIGNE ----------1 1 1 1 4 2 5 5 3 3 6 SERIE ----------1 2 3 4 5 1 2 3 1 2 1 ----------1 2 3 4 5 6 7 8 9

- 27 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog) 4 6 2

12

Les lignes grise reprsentent des doublons de la ligne prcdente. D'ou lide d'clater chaque ligne en autant de fois que l'indique la valeur de QUANTITE... cliquez pour rpondre et titrez votre mail "Problme n25 - clater des lignes"

IV-F - Problme n 26 - Noms incrments


Dans un site Web un problme rcurent vient des noms qui peuvent tre homonymes. Pour lever toute ambiguit, notre quidam veut qu'en cas d'insertion le nom dont la colonne est muni d'une clause d'unicit ne soit par rejet, mais qu'il lui soit ajout un numro calcul automatiquement en squence... Voici le modle de table et les donnes de notre quidam :
CREATE TABLE T_UTILISATEUR_USR (USR_ID INTEGER NOT NULL PRIMARY KEY, USR_NOM CHAR(16) NOT NULL UNIQUE); INSERT INTO T_UTILISATEUR_USR VALUES (1, 'DUPONT'); INSERT INTO T_UTILISATEUR_USR VALUES (2, 'DURAND'); INSERT INTO T_UTILISATEUR_USR VALUES (3, 'DURAND1'); SELECT * FROM T_UTILISATEUR_USR USR_ID ----------1 2 3 USR_NOM ---------------DUPONT DURAND DURAND1

Par exemple; si je tente de rentrer DUPOND, il doit insrer DUPOND. Si je tente de rentrer DUPONT, il doit insrer DUPONT1. Si je tente de rentrer DURAND, il doit insrer DURAND2... Comment faire cela en une seule requte ? cliquez pour rpondre et titrez votre mail "Problme n26 - Noms incrments"

IV-G - Problme n 27 - Une lettre un nom


Notre internaute recherche construire une requete sql qui me permette d'extraire d'une table la premire entre de chaque lettre alphabtique, donc de a z, par rapport une colonne contenant le nom d'une personne. Par exemple, avec la table T_CONTACT_CTC contenant une colonne CTC_NOM avec les valeur suivantes :(Aaron, Abel, Babe, Boudet, Cabi...), il voudrait obtenir la premire personne ayant l'initiale A, la premire personne ayant l'initiale B, etc... jusqu' Z. Voici la table pour ce faire :
CREATE TABLE T_CONTACT_CTC (CTC_NOM VARCHAR(32)); INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO T_CONTACT_CTC T_CONTACT_CTC T_CONTACT_CTC T_CONTACT_CTC T_CONTACT_CTC T_CONTACT_CTC T_CONTACT_CTC T_CONTACT_CTC VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES ('Aaron'); ('Abel'); ('Babet'); ('Boudet'); ('Brouard'); ('Cabu'); ('Corts'); ('Cardeau');

- 28 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog)

INSERT INTO T_CONTACT_CTC VALUES ('Zoltan'); LETTRE --------A B C ... Z CTC_NOM ------------------------Aaron Babet Cabu Zoltan

Mais n'ayons pas peur d'aller plus loin en posant quelques questions supplmentaires... variante 1 : obtenir les noms des "secondes" personnes variante 2 : obtenir les noms des niemes personnes variante 3 : obtenir les noms des niemes personnes, mais si elle n'existe pas, alors la dernire !
variante 1 : obtenir les noms des "secondes" personnes LETTRE CTC_NOM ------ -------------------------------A Aaron B Babet C Cabu Z Zoltan LETTRE CTC_NOM ------ -------------------------------B Brouard C Corts LETTRE CTC_NOM ------ -------------------------------A Abel B Boudet C Cardeau Z Zoltan

variante 2 : (n = 3)

variante 3 : (n = 2) obtenir les noms des niemes personnes, mais si elle n'existe pas, alors la dernire !

Comment faire cela et toujours en une seule requte ? cliquez pour rpondre et titrez votre mail "Problme n27 - Une lettre un nom"

IV-H - Problme n 28 - Filtrer les adresses IP


Pch sur le forum SQL de www.developpez.com : Bonjour tous, je travaille sur des adresses IP et je n'arrive pas a faire une selection comme ceci dans une requte sql :
Select adresseSource from Y where 10.120.12.1 <= adresseSource <= 10.130.23.1

10.120.12.1 correspond l'attribut DebutIPValide dans la table X 10.130.23.1 correspond l'attribut FinIPValide dans la table X adresseSource fait partie de la table Y Merci pour vos suggestions

Sauriez vous l'aider ? Voici la table des adresses IP et quelques lignes bien suffisantes pour tester votre travail :
CREATE TABLE TIP (TIP_ADR VARCHAR(15));

- 29 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog) INSERT INSERT INSERT INSERT INTO INTO INTO INTO TIP TIP TIP TIP VALUES VALUES VALUES VALUES ('10.120.12.1'); ('10.130.23.1'); ('10.130.201.1'); ('10.13.11.1');

Le rsultat de votre requte doit donner :


TIP_ADR ------------------10.120.12.1 10.130.23.1

Simple ? Pas sr ! A vos codes... cliquez pour rpondre et titrez votre mail "Problme n28 - Filtrer les adresses IP"

IV-I - Problme n 29 - Calculer l'adresses IP suivante


L'exercice prcdent m'a donn l'ide d'un exercice complmentaire... Partant d'une table de machines ayant des adresses IP, cette fois ci bien modlises, comment trouver l'adresse IP suivante pour insrer une nouvelle machine ? Voici la nouvelle table des machines avec leur adresse IP et quelques lignes de test :
CREATE TABLE T_MACHINE_MAC (MAC_ID INT NOT NULL PRIMARY KEY, MAC_NOM VARCHAR(16), MAC_ADRIP1 SMALLINT CHECK(MAC_ADRIP1 BETWEEN 0 AND 255), MAC_ADRIP2 SMALLINT CHECK(MAC_ADRIP2 BETWEEN 0 AND 255), MAC_ADRIP3 SMALLINT CHECK(MAC_ADRIP3 BETWEEN 0 AND 255), MAC_ADRIP4 SMALLINT CHECK(MAC_ADRIP4 BETWEEN 0 AND 255) CONSTRAINT CU_ADRIP UNIQUE (MAC_ADRIP1, MAC_ADRIP2, MAC_ADRIP3, MAC_ADRIP4)); INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO T_MACHINE_MAC T_MACHINE_MAC T_MACHINE_MAC T_MACHINE_MAC T_MACHINE_MAC VALUES VALUES VALUES VALUES VALUES (1, (2, (3, (4, (5, 'PC', 'PC', 'PC', 'PC', 'PC', 123, 12, 1, 200); 123, 12, 1, 255); 123, 12, 255, 255); 123, 13, 0, 0); 123, 255, 255, 255);

Le rsultat de votre requte doit tre :


MAC_ID ----------1 2 3 4 5 MAC_NOM ---------------PC PC PC PC PC NEW_ADRIP1 ----------123 123 123 123 124 NEW_ADRIP2 ----------12 12 13 13 0 NEW_ADRIP3 ----------1 2 0 0 0 NEW_ADRIP4 ----------201 0 1 1 0

Raisonnez petits pas. Emboitez vos requtes... cliquez pour rpondre et titrez votre mail "Problme n29 - Calculer l'adresse IP suivante

IV-J - Problme n 30 - Nombre de jours contigus


Pas facile, la question de Stphane T... Y a t il une formule magique qui permet de compter des dates conscutives en sql ? Comme vous le savez certainement dj, cette formule magique est une requte !
- 30 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog)

Voici les donnes qui nous servirons de test et la structure de la table associe :
CREATE TABLE T_PLANNING_PNG (PNG_DATE DATE); INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO T_PLANNING_PNG T_PLANNING_PNG T_PLANNING_PNG T_PLANNING_PNG T_PLANNING_PNG T_PLANNING_PNG T_PLANNING_PNG T_PLANNING_PNG VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES ('2004-01-01'); ('2004-01-02'); ('2004-01-03'); ('2004-01-15'); ('2004-01-16'); ('2004-01-17'); ('2004-01-18'); ('2004-01-30');

Le rsultat de votre requte doit tre :


DateDebut --------------2004-01-01 2004-01-15 2004-01-30 NbJours ------------3 4 1

Aidez-vous d'une table des dates... cliquez pour rpondre et titrez votre mail "Problme n30 - Nombre de jours contigus

V - Exercices - 4 Partie V-A - Problme 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 INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO INTO T_RENDEZ_VOUS_RDV T_RENDEZ_VOUS_RDV T_RENDEZ_VOUS_RDV T_RENDEZ_VOUS_RDV T_RENDEZ_VOUS_RDV T_RENDEZ_VOUS_RDV T_RENDEZ_VOUS_RDV T_RENDEZ_VOUS_RDV T_RENDEZ_VOUS_RDV VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES ('2008-01-07'); ('2008-01-11'); ('2008-01-14'); ('2008-01-16'); ('2008-01-18'); ('2008-01-21'); ('2008-01-22'); ('2008-01-24'); ('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 mme et 1. Ou plutt qu'un nombre qui n'est pas premier est divisible par un nombre compris entre 2 et luimme moins un... En l'occurrence, le rsultat doit tre le suivant :
RDV_DATE ------------2008-01-11

Testez donc votre solution avec une demande de rendez-vous le 23 janvier 2008...
- 31 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog)

cliquez pour rpondre et titrez votre mail " Problme n31 - plus proche valeur "

V-B - Problme n 32 - primes de salaires


Les employs de l'entreprise doivent recvoir une prime de salaire d'un montant donn et cette prime doit tre rpartie sur un nombre de mois donn. Cepandant il faut que la totalit de la prime soit donne, chaque prime tant arrondie au centime, la dernire 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 requte ? 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 rsultat attendu :
PRM_EMPLOYE -----------JAN JOE JOE JOE LUC LUC LUC LUC LUC LUC LUC LUC LUC LUC LUC LUC ECHEANCE --------1 1 2 3 1 2 3 4 5 6 7 8 9 10 11 12 MONTANT -----------1000.00 333.33 333.33 333.34 83.33 83.33 83.33 83.33 83.33 83.33 83.33 83.33 83.33 83.33 83.33 83.37

A vos claviers ! cliquez pour rpondre et titrez votre mail " Problme n32 - primes de salairesr "

V-C - Problme n 33 - affectations comptables


Notre utilisateur travaille dans une entreprise comptable et doit affecter au plus juste certains lments des comptes plus ou moins "flous" Un petit exemple vallant mieux qu'un long discours, voici les donnes de son problme : Exemple des donnes comptables :
compte -------612000 612000 612101 654000 654102 ana -------26045 12345 33556 26346 28333 montant -----------260.50 130.40 330.50 33.55 180.10

- 32 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog)

Rgles d'affectation :
compte ---------6????? 6????? 6????? 612??? 612???

ana -------????? ??5?? 26??? ????? ??5??

nouvelle affectation -------------------T124 T028 T033 T125 T126

Rsultat que l'on doit obtenir :


compte --------612000 612000 612101 654000 654102 montant ---------260.50 130.40 330.50 33.55 180.10

affectation ----------T125 T125 T126 T033 T124

-->(Regle -->(Rgle -->(Rgle -->(Rgle -->(Rgle

612??? 612??? 612??? 6????? 6?????

?????) ?????) ??5??) 26???) ?????)

Bref, partir de rgles d'affectation comptable un peu "floues" du fait de caractres gnriques, il convient de trouver la meilleure affectation comptable des donnes... Voici les tables avec lesquelles nous allons devoir tablir notre requte, et les donnes 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 INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO T_COMPTE_CPT T_COMPTE_CPT T_COMPTE_CPT T_COMPTE_CPT T_COMPTE_CPT VALUES VALUES VALUES VALUES VALUES ('612000', ('612000', ('612101', ('654000', ('654102', '26045', '12345', '33556', '26346', '28333', 260.50); 130.40); 330.50); 33.55); 180.10); 'T124'); 'T028'); 'T033'); 'T125'); 'T126');

T_AFFECTATION_AFC T_AFFECTATION_AFC T_AFFECTATION_AFC T_AFFECTATION_AFC T_AFFECTATION_AFC

VALUES VALUES VALUES VALUES VALUES

('6_____', ('6_____', ('6_____', ('612___', ('612___',

'_____', '__5__', '26___', '_____', '__5__',

Je vous ais d'ailleurs dj facilit la vie en remplacant les ? par des _ ! Vous connaissez dj le rsultat attendu, alors en piste ! Sachez cepandant qu'une lgante solution passe par l'ajout de donnes... cliquez pour rpondre et titrez votre mail " Problme n33 - affectations comptables "

V-D - Problme n 34 - prcdents (ou suivants)


Question simple et directe : comment numroter les lignes d'une requte et prvoir d'une ligne sur l'autre la rfrence la ligne prcdente ? Encore faut-il savoir quel ordre prendre en compte ! Partons d'une table on ne peut plus simple, puisque dote 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'); - 33 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog) INSERT INTO T_LIGNE_PRECEDENTE VALUES ('DDD');

Comment obtenir le rsultat suivant :


COL ---AAA BBB CCC DDD LIGNE_PRECEDENTE ---------------NULL AAA BBB CCC

D'ailleurs est-il possible d'informer de la ligne suivante et de la prcdente en mme temps ? cliquez pour rpondre et titrez votre mail " Problme n34 - prcdente et suivants "

V-E - Problme n 35 - matchs et victoires


Voici un dveloppeur confront des classements sportifs... Nous lui laissons la parole : Je voudrais gnrer un classement entre des joueurs partir des rsultats de matchs de tennis de table. J'ai pour l'instant cr les tables suivantes : TABLE T_JOUEUR_JOR
JOR_ID ------------1 2 3

JOR_NOM ----------Dupont Camus Mercier

TABLE T_MATCH_MCH
MCH_ID -----------1 2 3 4 JOR_ID1 -----------1 3 2 3 JOR_ID2 -----------3 2 1 1 MCH_SCORE_JOUEUR1 -----------------21 17 21 21 MCH_SCORE_JOUEUR2 -----------------15 21 13 10

Rsultat attendu :
JOR_ID ------------1 2 3 JOR_NOM -------------Dupont Camus Mercier NB_MATCHS ------------2 3 3 NB_VICTOIRES --------------1 2 1

A vous de jouer ! Voici la dfintion 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');

- 34 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog)

INSERT INSERT INSERT INSERT

INTO INTO INTO INTO

T_MATCH_MCH T_MATCH_MCH T_MATCH_MCH T_MATCH_MCH

VALUES VALUES VALUES VALUES

(1, (2, (3, (4,

1, 3, 2, 3,

3, 2, 1, 1,

21, 17, 21, 21,

15); 21); 13); 10);

cliquez pour rpondre et titrez votre mail " Problme n35 - matchs et victoires "

V-F - Problme n 36 - tri btard


Une mauvaise modlisation de donnes fait que notre internaute dsire un tri corresponsant l'ordre numrique pour une colonne ne contenant que des chiffres mais modlise en varchar... Venez lui en aide afin de trier ces donnes 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 caractres !
CREATE TABLE T_PARCELLE_PCL (PCL_NUM VARCHAR(16)); INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO T_PARCELLE_PCL T_PARCELLE_PCL T_PARCELLE_PCL T_PARCELLE_PCL T_PARCELLE_PCL T_PARCELLE_PCL T_PARCELLE_PCL T_PARCELLE_PCL T_PARCELLE_PCL T_PARCELLE_PCL VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES ('1'); ('11'); ('111'); ('2'); ('21'); ('22'); ('221'); ('28A'); ('28B'); ('3');

Voici la rponse attendue :


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

cliquez pour rpondre et titrez votre mail " Problme n36 - tri btard "

V-G - Problme n 37 - vote contraint


Un exercice inspir des fameux puzzle de Joe Celko... Une comptition de schnorkelzig ne comporte jamais que 4 comptiteurs. Dans la comptition exemple, les athltes sont Paul, Marc, Jean et Lon. Chaque membre du jury, et ils sont trs 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 Lon, 4e Paul. Mais les membres du jury peuvent laisser leur podium incomplet. Ainsi le jury MARTIN, aimerait le podium suivant : 1er Lon, 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 squence. 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 destine recevoir les votes est ainsi constitue :

- 35 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog) 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 ncessaires valider la saisie et empcher 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 --> squence incorrecte, aurait d tre 1, NULL, 2, 3 SCHMIDT 1 1 2 3 --> doublon (prsence du 1 deux fois)

Voici deux jeux d'essais. Le premier doit voir toutes ses lignes acceptes, le second aucune... podiums corrects
INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO

T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ

VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES

('JRY001', ('JRY002', ('JRY003', ('JRY004', ('JRY005', ('JRY006', ('JRY007', ('JRY008', ('JRY009', ('JRY010', ('JRY011', ('JRY012', ('JRY013', ('JRY014', ('JRY015',

1, 2, 3, 4) 1, 2, 4, 3) 1, 3, 2, 4) 1, 3, 4, 2) 2, 1, 3, 4) 2, 1, 4, 3) 3, 1, 2, 4) 4, 3, 1, 2) 1, NULL, 3, 2) NULL, 2, 1, 3) 1, 3, NULL, 2) 1, 3, 2, NULL) NULL, 2, 1, NULL) 1, NULL, NULL, 2) 1, NULL, NULL, NULL)

podiums incorrects
INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO

T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ T_SCHNORKELZIG_SKZ

VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES

('JRY999', ('JRY998', ('JRY997', ('JRY996', ('JRY995', ('JRY994', ('JRY993', ('JRY992', ('JRY991', ('JRY990', ('JRY989', ('JRY988',

1, 2, 1, 2, 1, 1, 1, 3, 1, 2, NULL, NULL, 2, 2, 1, 1, NULL, NULL, NULL,

3, 3) 3, 5) 2, 2) 3, 3) 2, 6) 2, 3, 3, 3, 3, 4) 1, 1) NULL, 6, 4, NULL,

4) 4) 6, 4) NULL) 2, NULL)

Pour cela vous devez crer une contrainte SQL, et une seule, la plus concise possible. Pour ma part j'ai russi cette contrainte avec 114 caractres en faisant appel une seule fois chacune des 4 colonnes... cliquez pour rpondre et titrez votre mail " Problme n37 - vote contraint "

V-H - Problme n 38 - proprit bien garde


Monsieur Fulmington est un milliardaire qui possde une charmante proprit Saint Jean Cap Ferrat. 168 pices, 382 hectares de jardins, 2 874 oeuvres d'art et 6 gardiens. Le problme est que Monsieur Fulmington ne sait pas si sa proprit est garde en permanence. Pourriez vous l'aider et regarder sur une semaine, celle allant du 1er au 7 septembre 2008, quelles sont la ou les priodes pendant lesquelles la proprit n'est pas surveille ? Le planning de gardiennage figure dans la table suivante :

- 36 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog) CREATE TABLE T_GARDIENNAGE_GDN (GDN_NOM VARCHAR(16), GDN_DATEHEURE_DEBUT TIMESTAMP, GDN_DATEHEURE_FIN TIMESTAMP) ; INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO T_GARDIENNAGE_GDN T_GARDIENNAGE_GDN T_GARDIENNAGE_GDN T_GARDIENNAGE_GDN T_GARDIENNAGE_GDN T_GARDIENNAGE_GDN T_GARDIENNAGE_GDN T_GARDIENNAGE_GDN T_GARDIENNAGE_GDN T_GARDIENNAGE_GDN T_GARDIENNAGE_GDN T_GARDIENNAGE_GDN T_GARDIENNAGE_GDN T_GARDIENNAGE_GDN T_GARDIENNAGE_GDN T_GARDIENNAGE_GDN T_GARDIENNAGE_GDN T_GARDIENNAGE_GDN T_GARDIENNAGE_GDN T_GARDIENNAGE_GDN T_GARDIENNAGE_GDN VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES ('LEON', ('LEON', ('LEON', ('MARC', ('MARC', ('MARC', ('MARC', ('PAUL', ('PAUL', ('PAUL', ('PAUL', ('JACK', ('JACK', ('JACK', ('DICK', ('DICK', ('DICK', ('DICK', ('CHAD', ('CHAD', ('CHAD', '2008-09-01 '2008-09-03 '2008-09-07 '2008-09-01 '2008-09-03 '2008-09-05 '2008-09-06 '2008-09-02 '2008-09-03 '2008-09-04 '2008-09-06 '2008-09-02 '2008-09-05 '2008-09-06 '2008-09-01 '2008-09-03 '2008-09-06 '2008-09-07 '2008-09-01 '2008-09-04 '2008-09-06 22:30:00', 18:00:00', 06:00:00', 07:30:00', 08:30:00', 09:30:00', 08:30:00', 06:00:00', 06:00:00', 06:00:00', 12:00:00', 08:30:00', 08:30:00', 21:00:00', 12:30:00', 22:30:00', 16:30:00', 18:30:00', 23:30:00', 14:30:00', 10:30:00', '2008-09-02 '2008-09-04 '2008-09-07 '2008-09-01 '2008-09-03 '2008-09-05 '2008-09-06 '2008-09-02 '2008-09-03 '2008-09-04 '2008-09-06 '2008-09-02 '2008-09-05 '2008-09-07 '2008-09-02 '2008-09-04 '2008-09-07 '2008-09-08 '2008-09-02 '2008-09-05 '2008-09-06 08:00:00') 04:30:00') 12:30:00') 14:30:00') 16:00:00') 12:00:00') 13:30:00') 17:30:00') 17:30:00') 17:30:00') 22:30:00') 16:00:00') 21:30:00') 10:30:00') 00:00:00') 10:00:00') 10:30:00') 06:30:00') 11:00:00') 08:30:00') 21:00:00') ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;

Voici le rsultat attendu...


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

A l'vidence, Monsieur Fulmington du mourron se faire ! cliquez pour rpondre et titrez votre mail " Problme n38 - proprit bien garde "

V-I - Problme n 39 - abstract et mots clefs


Encore une base mal modlise... Dans une base documentaire figure dans une table le nom d'un article dans une colonne et dans l'autre colonne un conglomrat des mots clef (abstract) de l'article. Pour sparer les mots clef, le dveloppeur trouv judicieux d'utiliser le caractre # (dise) entre les expressions. Voici le jeu de donnes sur lequel nous allons travailler :
CREATE TABLE T_PAPIER_PPR (PPR_TITRE VARCHAR(36), PPR_ABSTRACT VARCHAR(120)) ; INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO T_PAPIER_PPR T_PAPIER_PPR T_PAPIER_PPR T_PAPIER_PPR T_PAPIER_PPR T_PAPIER_PPR VALUES VALUES VALUES VALUES VALUES VALUES ('Les derniers roi de France', 'Histoire#Politique') ; ('De Gaulle, un hro de l''histoire', 'Histoire#Politique#Guerre') ; ('Les deux guerres mondiales', 'Histoire#Guerre') ; ('Les annes 50 en Europe', 'Histoire#Union europenne') ; ('Les prsidents de la rpublique', 'Histoire#Politique') ; ('Histoire de France', 'Histoire') ;

Comme vous le voyez la premire forme normale n'est pas respecte puisque plusieurs informations figurent dans une seule et mme colonne ! Cependant, notre quidam doit renvoyer comme rponse le nombre d'apparition des mots clefs dans une slection d'article. Par exemple, ici, le rsultat devrait tre :
- 37 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog) MOT_CLEF ------------------Histoire Politique Guerre Union europenne NOMBRE ---------5 3 2 1

Sauriez-vous l'aider accomplir sa tche ? cliquez pour rpondre et titrez votre mail " Problme n39 - abstract et mots clefs "

V-J - Problme n 40 - gestion des stocks


Un problme bien classique : partir d'une table des rception de produits et des commandes clients, notre magazinier aimerait avoir un tat des stocke au jour le jour... Voyons cela en dtail... 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 INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO T_RECEPTION_RCP T_RECEPTION_RCP T_RECEPTION_RCP T_RECEPTION_RCP T_RECEPTION_RCP T_RECEPTION_RCP T_RECEPTION_RCP T_RECEPTION_RCP T_RECEPTION_RCP T_COMMANDE_CMD T_COMMANDE_CMD T_COMMANDE_CMD T_COMMANDE_CMD VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES (1, (1, (1, (2, (2, (3, (4, (4, (4, '2008-01-01', '2008-02-01', '2008-03-15', '2008-02-10', '2008-03-20', '2008-01-12', '2008-01-01', '2008-01-15', '2008-02-01', 10) 20) 5) 20) 25) 20) 10) 20) 30) 45) 35) 20) 75) ; ; ; ; ; ; ; ; ; ; ; ; ;

(1, (2, (3, (4,

'2008-02-11', '2008-02-15', '2008-02-01' '2008-01-05'

Les lignes de rception sont celles des produits alimentant le stock. Les lignes des commandes sont celles sortant du stock... Notre magazinier aimerait obtenir la prsentation suivante :
PRD_ID ---------1 1 1 1 2 2 2 3 3 4 4 4 4 DATE_STOCK -------------2008-01-01 2008-02-01 2008-02-11 2008-03-15 2008-02-10 2008-02-15 2008-03-20 2008-01-12 2008-02-01 2008-01-01 2008-01-05 2008-01-15 2008-02-01 QTE_PRISE ------------NULL NULL 45 NULL NULL 35 NULL NULL 20 NULL 75 NULL NULL QTE_RECUE ------------10 20 NULL 5 20 NULL 25 20 NULL 10 NULL 20 30 QTE_DISPO ------------10 20 0 0 20 0 10 20 0 10 0 0 0 RESTE_A_COMPLETER ----------------0 0 15 10 0 15 0 0 0 0 65 45 15

Qui lui permet de connatre au jour le jour ou il est est avec toutes les variations de stock. Sauriez vous laborer une telle requte ?
- 38 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

Le SQL de A Z par SQLPro (autres articles) (Blog)

cliquez pour rpondre et titrez votre mail " Problme n40 - gestion des stocks "

- 39 Copyright - SQLPro. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://sqlpro.developpez.com/Exercices/

You might also like