<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Exercices avec le langage SQL</title>
	<atom:link href="https://blog.developpez.com/exercices-sql/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/exercices-sql</link>
	<description></description>
	<lastBuildDate>Wed, 28 Jun 2017 12:17:57 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Rapprochement bancaire</title>
		<link>https://blog.developpez.com/exercices-sql/p13149/exercices-sql/rapprochement-bancaire</link>
		<comments>https://blog.developpez.com/exercices-sql/p13149/exercices-sql/rapprochement-bancaire#comments</comments>
		<pubDate>Wed, 28 Jun 2017 12:17:57 +0000</pubDate>
		<dc:creator><![CDATA[SQLpro]]></dc:creator>
				<category><![CDATA[Exercices SQL]]></category>
		<category><![CDATA[SQL pur]]></category>
		<category><![CDATA[comptabilité]]></category>
		<category><![CDATA[compte]]></category>
		<category><![CDATA[crédit]]></category>
		<category><![CDATA[débit]]></category>
		<category><![CDATA[raprochement]]></category>
		<category><![CDATA[requête]]></category>
		<category><![CDATA[solde]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/exercices-sql/?p=13</guid>
		<description><![CDATA[Comment effectuer en une seule requête des rapprochement bancaires pour solder des débits et des crédits ? Cette requête peut répondre à votre attente. Soit une table constituée de toutes les opérations de débit et crédit des clients constituée comme suit : CREATE TABLE T_OPERATION_COMPTABLE_OPC &#40;OPC_ID &#160; &#160; &#160; &#160; &#160; &#160; &#160;INT IDENTITY PRIMARY KEY, &#160;OPC_REFCODE &#160; &#160; &#160; &#160; CHAR&#40;8&#41; NOT NULL UNIQUE, &#160;CLI_ID &#160; &#160; &#160; &#160; &#160; &#160; &#160;INT NOT NULL, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Comment effectuer en une seule requête des rapprochement bancaires pour solder des débits et des crédits ? Cette requête peut répondre à votre attente.<br />
<span id="more-13"></span><br />
Soit une table constituée de toutes les opérations de débit et crédit des clients constituée comme suit :</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> T_OPERATION_COMPTABLE_OPC<br />
<span style="color: #66cc66;">&#40;</span>OPC_ID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">INT</span> <span style="color: #993333; font-weight: bold;">IDENTITY</span> <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span><br />
&nbsp;OPC_REFCODE &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">CHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">8</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">UNIQUE</span><span style="color: #66cc66;">,</span><br />
&nbsp;CLI_ID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">INT</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span> <span style="color: #808080; font-style: italic;">-- REFERENCES T_CLIENT_CLI (CLI_ID)</span><br />
&nbsp;OPC_DATE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">DATE</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span> <br />
&nbsp;OPC_MONTANT &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">DECIMAL</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">16</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">CHECK</span><span style="color: #66cc66;">&#40;</span>OPC_MONTANT <span style="color: #66cc66;">&gt;=</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp;OPC_CREDIT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;BIT <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<p>Toutes les colonnes de la table ne sont pas NULLable :<br />
* OPC_ID est la clef primaire de la table.<br />
* OPC_REFCODE une clé alternative (contrainte UNIQUE) sémantique portant la référence de la pièce comptable.<br />
* CLI_ID est une clef étrangère pointant sur la table des clients (non modélisée).<br />
* OPC_DATE est la date d&rsquo;opération.<br />
* OPC_MONTANT est le montant de l&rsquo;opération, montant toujours positif (notez la contrainte CHECK).<br />
* OPC_CREDIT est un booléen indiquant s&rsquo;il s&rsquo;agit d&rsquo;un crédit (valeur 1) ou d&rsquo;un débit (valeur 0).<br />
Si votre SGBDR ne supporte pas IDENTITY (norme SQL) utilisez le mécansime d&rsquo;incrément propre à votre système (par exemple SERIAL pour PostGreSQL et dans ce cas supprimez le INT, car PostGreSQL ne permet pas de choisir le type de données affecté à un auto incrément). De même si votre SGBDR ne supporte pas le type BIT, remplacez_le par un type booléen adapté à votre SGBDR (par exemple pour PostGreSQL BOOLEAN).</p>
<p>Insertion d&rsquo;un jeu de données :</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> T_OPERATION_COMPTABLE_OPC <span style="color: #993333; font-weight: bold;">VALUES</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'AX'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">10001</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'2017-05-30'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">90</span><span style="color: #66cc66;">,</span> &nbsp;<span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'DZ'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">10001</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'2017-05-12'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">100</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'EF'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">10001</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'2017-04-10'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">50</span><span style="color: #66cc66;">,</span> &nbsp;<span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'SH'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">10001</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'2017-03-25'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">100</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'MN'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">10001</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'2017-03-10'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">90</span><span style="color: #66cc66;">,</span> &nbsp;<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'GL'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">10001</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'2017-02-20'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">80</span><span style="color: #66cc66;">,</span> &nbsp;<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'AZ'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">10002</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'2017-05-30'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">75</span><span style="color: #66cc66;">,</span> &nbsp;<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'DG'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">10002</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'2017-05-10'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">100</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'ES'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">10002</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'2017-04-30'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">100</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'SV'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">10002</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'2017-03-30'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">100</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'MH'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">10002</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'2017-03-15'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">50</span><span style="color: #66cc66;">,</span> &nbsp;<span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'GW'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">10002</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'2017-02-20'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">100</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<p>Deux clients (10001 et 10002) ont fait différentes opérations d&rsquo;achat et paiement et nous devons effectuer les rapprochement entre ces différentes opérations pour en connaître le solde.<br />
Le résultat doit être le suivant :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">CLI_ID &nbsp; &nbsp; &nbsp;DateDebit &nbsp;RefDebit MontantDebit &nbsp;DateCredit RefCredit MontantCredit &nbsp;Solde<br />
----------- ---------- -------- ------------- ---------- --------- -------------- ---------<br />
10001 &nbsp; &nbsp; &nbsp; 2017-03-25 SH &nbsp; &nbsp; &nbsp; 100.00 &nbsp; &nbsp; &nbsp; &nbsp;2017-02-20 GL &nbsp; &nbsp; &nbsp; &nbsp;80.00 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-20.00<br />
10001 &nbsp; &nbsp; &nbsp; 2017-03-25 SH &nbsp; &nbsp; &nbsp; 100.00 &nbsp; &nbsp; &nbsp; &nbsp;2017-03-10 MN &nbsp; &nbsp; &nbsp; &nbsp;90.00 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;70.00<br />
10001 &nbsp; &nbsp; &nbsp; 2017-04-10 EF &nbsp; &nbsp; &nbsp; 50.00 &nbsp; &nbsp; &nbsp; &nbsp; 2017-03-10 MN &nbsp; &nbsp; &nbsp; &nbsp;90.00 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;20.00<br />
10001 &nbsp; &nbsp; &nbsp; 2017-05-30 AX &nbsp; &nbsp; &nbsp; 90.00 &nbsp; &nbsp; &nbsp; &nbsp; 2017-03-10 MN &nbsp; &nbsp; &nbsp; &nbsp;90.00 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-70.00<br />
10001 &nbsp; &nbsp; &nbsp; 2017-05-30 AX &nbsp; &nbsp; &nbsp; 90.00 &nbsp; &nbsp; &nbsp; &nbsp; 2017-05-12 DZ &nbsp; &nbsp; &nbsp; &nbsp;100.00 &nbsp; &nbsp; &nbsp; &nbsp; 30.00<br />
10002 &nbsp; &nbsp; &nbsp; 2017-02-20 GW &nbsp; &nbsp; &nbsp; 100.00 &nbsp; &nbsp; &nbsp; &nbsp;2017-03-30 SV &nbsp; &nbsp; &nbsp; &nbsp;100.00 &nbsp; &nbsp; &nbsp; &nbsp; 0.00<br />
10002 &nbsp; &nbsp; &nbsp; 2017-03-15 MH &nbsp; &nbsp; &nbsp; 50.00 &nbsp; &nbsp; &nbsp; &nbsp; 2017-03-30 SV &nbsp; &nbsp; &nbsp; &nbsp;100.00 &nbsp; &nbsp; &nbsp; &nbsp; -50.00<br />
10002 &nbsp; &nbsp; &nbsp; 2017-03-15 MH &nbsp; &nbsp; &nbsp; 50.00 &nbsp; &nbsp; &nbsp; &nbsp; 2017-04-30 ES &nbsp; &nbsp; &nbsp; &nbsp;100.00 &nbsp; &nbsp; &nbsp; &nbsp; 50.00<br />
10002 &nbsp; &nbsp; &nbsp; 2017-05-10 DG &nbsp; &nbsp; &nbsp; 100.00 &nbsp; &nbsp; &nbsp; &nbsp;2017-04-30 ES &nbsp; &nbsp; &nbsp; &nbsp;100.00 &nbsp; &nbsp; &nbsp; &nbsp; -50.00<br />
10002 &nbsp; &nbsp; &nbsp; 2017-05-10 DG &nbsp; &nbsp; &nbsp; 100.00 &nbsp; &nbsp; &nbsp; &nbsp;2017-05-30 AZ &nbsp; &nbsp; &nbsp; &nbsp;75.00 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;25.00</div></div>
<p>La requête suivante permet de parvenir à ce résultat :</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">WITH</span><br />
TD <span style="color: #993333; font-weight: bold;">AS</span> <br />
<span style="color: #66cc66;">&#40;</span><br />
<span style="color: #993333; font-weight: bold;">SELECT</span> CLI_ID<span style="color: #66cc66;">,</span> OPC_DATE <span style="color: #993333; font-weight: bold;">AS</span> DateDebit<span style="color: #66cc66;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp;OPC_MONTANT <span style="color: #993333; font-weight: bold;">AS</span> MontantDebit<span style="color: #66cc66;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp;OPC_REFCODE <span style="color: #993333; font-weight: bold;">AS</span> RefDebit<span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">SUM</span><span style="color: #66cc66;">&#40;</span>OPC_MONTANT<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">OVER</span><span style="color: #66cc66;">&#40;</span>PARTITION <span style="color: #993333; font-weight: bold;">BY</span> CLI_ID <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> OPC_DATE<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> CumulDebit<br />
<span style="color: #993333; font-weight: bold;">FROM</span> &nbsp; T_OPERATION_COMPTABLE_OPC <br />
<span style="color: #993333; font-weight: bold;">WHERE</span> &nbsp;OPC_CREDIT <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span><br />
<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
TC <span style="color: #993333; font-weight: bold;">AS</span> <br />
<span style="color: #66cc66;">&#40;</span><br />
<span style="color: #993333; font-weight: bold;">SELECT</span> CLI_ID<span style="color: #66cc66;">,</span> OPC_DATE <span style="color: #993333; font-weight: bold;">AS</span> DateCredit<span style="color: #66cc66;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp;OPC_MONTANT <span style="color: #993333; font-weight: bold;">AS</span> MontantCredit<span style="color: #66cc66;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp;OPC_REFCODE <span style="color: #993333; font-weight: bold;">AS</span> RefCredit<span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">SUM</span><span style="color: #66cc66;">&#40;</span>OPC_MONTANT<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">OVER</span><span style="color: #66cc66;">&#40;</span>PARTITION <span style="color: #993333; font-weight: bold;">BY</span> CLI_ID <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> OPC_DATE<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> CumulCredit<br />
<span style="color: #993333; font-weight: bold;">FROM</span> &nbsp; T_OPERATION_COMPTABLE_OPC <br />
<span style="color: #993333; font-weight: bold;">WHERE</span> &nbsp;OPC_CREDIT <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span><br />
<span style="color: #66cc66;">&#41;</span><br />
<span style="color: #993333; font-weight: bold;">SELECT</span> TD<span style="color: #66cc66;">.</span>CLI_ID<span style="color: #66cc66;">,</span> DateDebit<span style="color: #66cc66;">,</span> RefDebit<span style="color: #66cc66;">,</span> MontantDebit<span style="color: #66cc66;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DateCredit<span style="color: #66cc66;">,</span> RefCredit<span style="color: #66cc66;">,</span> MontantCredit<span style="color: #66cc66;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp;CumulCredit <span style="color: #66cc66;">-</span> CumulDebit <span style="color: #993333; font-weight: bold;">AS</span> Solde<br />
<span style="color: #993333; font-weight: bold;">FROM</span> &nbsp; TD <br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">INNER</span> <span style="color: #993333; font-weight: bold;">JOIN</span> TC<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">ON</span> &nbsp;TC<span style="color: #66cc66;">.</span>CLI_ID <span style="color: #66cc66;">=</span> TD<span style="color: #66cc66;">.</span>CLI_ID<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">AND</span><span style="color: #66cc66;">&#40;</span> &nbsp; &nbsp;<span style="color: #66cc66;">&#40;</span>TC<span style="color: #66cc66;">.</span>CumulCredit <span style="color: #66cc66;">&gt;</span> TD<span style="color: #66cc66;">.</span>CumulDebit &nbsp;<span style="color: #66cc66;">-</span> TD<span style="color: #66cc66;">.</span>MontantDebit &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">AND</span> TC<span style="color: #66cc66;">.</span>DateCredit &nbsp;TC<span style="color: #66cc66;">.</span>CumulCredit <span style="color: #66cc66;">-</span> TC<span style="color: #66cc66;">.</span>MontantCredit <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">AND</span> TC<span style="color: #66cc66;">.</span>DateCredit <span style="color: #66cc66;">&gt;=</span> TD<span style="color: #66cc66;">.</span>DateDebit<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span><br />
<span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> TD<span style="color: #66cc66;">.</span>CLI_ID<span style="color: #66cc66;">,</span> TD<span style="color: #66cc66;">.</span>DateDebit<span style="color: #66cc66;">,</span> TC<span style="color: #66cc66;">.</span>DateCredit;</div></div>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Frédéric Brouard, alias SQLpro, ARCHITECTE DE DONNÉES<br />
Expert &nbsp;S.G.B.D &nbsp;relationnelles &nbsp; et &nbsp; langage &nbsp;S.Q.L<br />
Moste &nbsp;Valuable &nbsp;Professionnal &nbsp;Microsoft &nbsp;SQL Server<br />
Société SQLspot &nbsp;: &nbsp;modélisation, conseil, formation,<br />
optimisation, &nbsp;audit, &nbsp;tuning, &nbsp;administration &nbsp;SGBDR<br />
Enseignant: CNAM PACA, ISEN Toulon, CESI Aix en Prov.</div></div>
<p>L&rsquo;entreprise <a href="http://www.sqlspot.com">SQL Spot</a><br />
<strong>Le site web sur le </strong><a href="http://sqlpro.developpez.com/">SQL et les SGBDR</a></p>
<p><img src="http://blog.developpez.com/media/Microsoft_MVP_logo_vertical Brouard 400.jpg" width="400" height="135" alt="MVP Microsoft SQL
Server" /></p>
<div id="attachment_590" style="width: 548px" class="wp-caption alignnone"><a href="http://blog.developpez.com/sqlpro/files/2015/09/Couverture-livre-SQL-server-Eyrolles.jpg"><img src="http://blog.developpez.com/sqlpro/files/2015/09/Couverture-livre-SQL-server-Eyrolles.jpg" alt="Développez et administrez pour la performance avec SQL Server 2014" width="538" height="652" class="size-full wp-image-590" /></a><p class="wp-caption-text">Développez et administrez pour la performance avec SQL Server 2014</p></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modélisation d&#8217;une adresse</title>
		<link>https://blog.developpez.com/exercices-sql/p10901/exercices-sql/modelisation_d_une_adresse</link>
		<comments>https://blog.developpez.com/exercices-sql/p10901/exercices-sql/modelisation_d_une_adresse#comments</comments>
		<pubDate>Sun, 01 Apr 2012 15:05:25 +0000</pubDate>
		<dc:creator><![CDATA[SQLpro]]></dc:creator>
				<category><![CDATA[Exercices SQL]]></category>
		<category><![CDATA[Modèle de données]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Faisant suite à l&#8217;article consacré à la modélisation des personnes, voici celui consacré à la modélisation des adresses répondant aux normes européennes de l&#8217;adresse postale : Commençons par le MCD : L&#8217;entité entité T_E_ADRESSE_ADR comporte les éléments de tête de l&#8217;adresse : &#8211; code postal (8 caractères) &#8211; ville (32 caractères) &#8211;> Soit au total 38 caractères (32 + blanc + 8) &#8211; éventuel CEDEX &#8211; éventuel mention de &#171;&#160;Chez m. Untel&#8230;&#160;&#187; L&#8217;entité fille ligne [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Faisant suite à l&rsquo;article consacré à la <a href="http://blog.developpez.com/exercices-sql/p9438/exercices-sql/modele-de-donnees/modelisation-de-personnes/">modélisation des personnes</a>, voici celui consacré à la modélisation des adresses répondant aux <a href="http://sqlpro.developpez.com/cours/normes/#L3">normes européennes de l&rsquo;adresse postale</a> :<br />
<span id="more-9"></span><br />
<strong>Commençons par le MCD :</strong></p>
<p><img src="http://blog.developpez.com/media/MCD_adresse.gif" width="1190" height="619" alt="MCD adresse postale" /><br />
L&rsquo;entité entité T_E_ADRESSE_ADR comporte les éléments de tête de l&rsquo;adresse :<br />
&#8211; code postal (8 caractères)<br />
&#8211; ville (32 caractères)<br />
&#8211;> Soit au total 38 caractères (32 + blanc + 8)<br />
&#8211; éventuel CEDEX<br />
&#8211; éventuel mention de &laquo;&nbsp;Chez m. Untel&#8230;&nbsp;&raquo;<br />
L&rsquo;entité fille ligne d&rsquo;adresse T_E_ADRESSE_LIGNE_ADL permet de faire figurer 1 à 4 lignes complémentaires de 38 caractères.<br />
On doit indiquer la position de chaque ligne (1, 2, 3 ou 4 donc une contrainte de domaine) car un SGBDR étant par nature ensembliste, bien que les lignes aient été rentrées dans un certains ordre, il est possible qu&rsquo;il restitue dans le désordre les lignes saisie, d’où l&rsquo;importance de la notion de position de la ligne.<br />
En sus une indication booléenne permet de savoir quelle ligne est la voie (lorsqu&rsquo;il y en a une) afin de pouvoir effectuer un contrôle de validité d&rsquo;adresse auprès d&rsquo;un organisme spécialisé.</p>
<p>Vous noterez la dissociation entre l&rsquo;entité externe des codes postaux T_X_CODE_POSTAL_CPL (données venant de La Poste, mais que l&rsquo;on pourrait étendre à des listes de codes postaux étrangers) et le couple code postal / ville dans l&rsquo;entité T_E_ADRESSE_ADR. Ceci est voulu car les codes postaux évoluent continuellement et qu&rsquo;un couplage fort par intégrité référentielle rendrait difficile à maintenir. En ce faisant, la liste des codes postaux est récupérée auprès de la poste 1 fois l&rsquo;an et on peut ajouter dans la table des adresse des codes postaux divergents, par leur nouveauté. L&rsquo;entité T_X_CODE_POSTAL_CPL servant simplement d&rsquo;aide à la saisie dans l&rsquo;IHM.</p>
<p><strong>Au niveau du MPD</strong>, deux contraintes sont à ajouter :</p>
<p>Outre la contrainte de domaine de la colonne ADL_POSITION (CHECK (ADL_POSITION BETWEEN 1 AND 4)) définie dans le MCD, on doit ajouter :</p>
<p>&#8211; une contrainte d&rsquo;unicité entre dans la table T_E_ADRESSE_LIGNE_ADL pour les colonnes ADR_ID et ADL_POSITION :</p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp;ALTER TABLE T_E_ADRESSE_LIGNE_ADL <br />
&nbsp; &nbsp; &nbsp; ADD CONSTRAINT UK_ADL_ADR_POS &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UNIQUE (ADR_ID, ADL_POSITION);</div></div>

</pre>
<p>&#8211; une contrainte sous forme de déclencheur afin qu&rsquo;il n&rsquo;y ait jamais qu&rsquo;une seule ligne d&rsquo;adresse ayant la valeur &laquo;&nbsp;true&nbsp;&raquo; pour la colonne ADL_VOIE. Voici le code d&rsquo;un tel déclencheur pour MS SQL Server :<br />
CREATE TRIGGER E_IU_ADL</p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ON T_E_ADRESSE_LIGNE_ADL <br />
AFTER INSERT, UPDATE <br />
IF EXISTS(SELECT NULL &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FROM &nbsp; T_E_ADRESSE_LIGNE_ADL <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WHERE &nbsp;ADL_VOIE = 1 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GROUP &nbsp;BY ADR_ID <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HAVING COUNT(*) &gt; 1) <br />
&nbsp; &nbsp;ROLLBACK;</div></div>

</pre>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">-------- <br />
Frédéric Brouard, SQLpro - ARCHITECTE DE DONNÉES, http://sqlpro.developpez.com/ <br />
Expert bases de données relationnelles et langage SQL. MVP Microsoft SQL Server <br />
www.sqlspot.com : modélisation, conseil, audit, optimisation, tuning, formation <br />
* * * * * &nbsp;Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence &nbsp;* * * * *</div></div>

</pre>
<p><img src="http://blog.developpez.com/media/Microsoft_MVP_logo_vertical Brouard 400.jpg" width="400" height="135" alt="MVP Microsoft SQL Server" /> </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Modélisation de personnes</title>
		<link>https://blog.developpez.com/exercices-sql/p9438/exercices-sql/modele-de-donnees/modelisation_de_personnes</link>
		<comments>https://blog.developpez.com/exercices-sql/p9438/exercices-sql/modele-de-donnees/modelisation_de_personnes#comments</comments>
		<pubDate>Mon, 01 Nov 2010 10:55:36 +0000</pubDate>
		<dc:creator><![CDATA[SQLpro]]></dc:creator>
				<category><![CDATA[Modèle de données]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[A partir de la question saugrenue d&#8217;un internaute &#171;&#160;Ou se trouvent les design pattern pour modéliser les données d&#8217;une personne ?&#160;&#187; j&#8217;ai eu envie de montrer ce que pouvait être un modèle de données pour modéliser une personne. A priori ce modèle MERISE peut paraître complexe, mais : On peut le simplifier en ne retenant pas certaines fonctionnalités On utilisera des vues afin de simplifier le travail du développeur 1 &#8211; MCD PERSONNE Voici le [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>A partir de la question saugrenue d&rsquo;un internaute &laquo;&nbsp;<em>Ou se trouvent les </em><strong><em>design pattern</em></strong><em> pour modéliser les données d&rsquo;une personne ?</em>&nbsp;&raquo; j&rsquo;ai eu envie de montrer ce que pouvait être un modèle de données pour modéliser une personne.<br />
<span id="more-7"></span><br />
A priori ce modèle MERISE peut paraître complexe, mais :</p>
<ul>
<li>On peut le simplifier en ne retenant pas certaines fonctionnalités</li>
<li>On utilisera des vues afin de simplifier le travail du développeur</li>
</ul>
<p><strong>1 &#8211; MCD PERSONNE</strong></p>
<p>Voici le MCD qui concerne la <em>Personne</em> et qui se découpe en trois parties : la personne physique (être humain), la personne morale (entreprise) et la partie &laquo;&nbsp;générique&nbsp;&raquo; des personnes, c&rsquo;est à dire les données communes aux personnes physiques ou morales.<br />
<em>Il n&rsquo;est pas habituel de faire figurer dans le MCD les colonnes calculées. Néanmoins nous avons jugé plus intéressant de les faire figurer à ce niveau afin que l&rsquo;utilisateur puisse les prendre en considération dès à présent. Pour ce faire, nous les avons notés avec le mot CALC dans le nom de l&rsquo;attribut.</em></p>
<p><img src="http://blog.developpez.com/media/MCD_Personne_Small_02.gif" width="1014" height="682" alt="Modèle Conceptuel de données des Personnes" /><br />
<em>Pour une image plus grande, cliquez </em><a href="http://blog.developpez.com/media/MCD_Personne_02.gif"><em>ici</em></a>.</p>
<p><strong>NOTA</strong> : le MCD a été édité sous Power AMC en notation MERISE et peut aboutir à la génération d&rsquo;une base de données de n&rsquo;importe quel SGBDR comme <em>DB2, INFORMIX, InterBase, Access, SQL Server, MySQL, PostGreSQL, Oracle, Sybase, Teradata</em>&#8230; entre autres !</p>
<p><strong>A ce stade il nous faut commenter la manière de modéliser&#8230;</strong></p>
<p>1 &#8211; les entités figurant en jaune sont des entités de référence. Elles ont toutes une forme similaire, c&rsquo;est à dire composées des mêmes attributs (domaines compris). Leur nom commence systématiquement par T_R_&#8230; (R pour Référence).<br />
2 &#8211; les entités figurant en vert sont des entités informationnelles, c&rsquo;est à dire celles qui contiendront les données fonctionnelles de l&rsquo;application. Leur nom commence systématiquement par T_E_&#8230; (E pour Entité).<br />
3 &#8211; les entités figurant en rose fuchsia sont des entités de données externes. Elle doivent contenir des données venant de sources externes non directement controlables (dans notre cas liste des pays de l&rsquo;INSEE, liste des codes postaux&#8230;). Leur nom commence systématiquement par T_X_&#8230; (X pour Externe).<br />
4 &#8211; les associations en rose fuchsia sont des associations de cardinalité 1:1 (un à un).<br />
5 &#8211; les associations en mauve sont des associations de cardinalité 1:n (un à plusieurs).<br />
6 &#8211; les associations en bleu ciel sont des associations de cardinalité n à m (plusieurs à plusieurs) qui se traduiront en tables de jointure<br />
<strong>NOTEZ</strong> que les noms des tables sont suffixées par un trigramme (trois lettres) destiné à simplifier leur dénomination et qui doit être unique au sein du modèle. D&rsquo;autre part les attributs des entités comme des associations reprennent en préfixe le trigramme de l&rsquo;entité ou de l&rsquo;association auquel ils appartiennent. Tout ceci étant conforme à la norme expliquée ici <a href="http://sqlpro.developpez.com/cours/standards/">http://sqlpro.developpez.com/cours/standards/</a> et détaillée ici <a href="http://www.sqlspot.com/Norme-de-developpement.html">http://www.sqlspot.com/Norme-de-developpement.html</a></p>
<p>Les entités de référence sont structurées de la manière suivante (<em>XXX</em> représente le trigramme) :<br />
<em>XXX</em>_ID :  la clef auto-incrémentée<br />
<em>XXX</em>_CODE : un code synthétique et unique (contrainte d&rsquo;unicité à prévoir)<br />
<em>XXX</em>_LIBELLE : un libellé explicite<br />
<em>XXX</em>_BASE : un booléen qui indique si la données est propre à la base (et donc non modifiable ni supprimable) ou bien spécifique à l&rsquo;utilisateur (donc modifiable et supprimable)<br />
<em>XXX</em>_ORDRE : un entier positif permettant de forcer un ordre particulier</p>
<p><strong>1.1 &#8211; Explication du modèle</strong></p>
<p>L&rsquo;entité <strong>T_E_PERSONNE_PRS</strong> ne contient qu&rsquo;une clef de type auto incrémentée. Elle sert de racine à l&rsquo;héritage exclusif entre les personnes physiques et morales. Bien qu&rsquo;elle apparaisse quasiment vide, elle est en fait nécessaire pour &laquo;&nbsp;raccrocher&nbsp;&raquo; les entités de contact que sont les téléphones (fixe, fax ou mobile), les mails et les adresses.</p>
<p>L&rsquo;entité <strong>T_E_PERSONNE_MORALE_PMR</strong> contient tous les éléments spécifiques d&rsquo;une personne morale comme sa raison sociale, son enseigne, et ses codes SIREN, établissement (en fait la partie SIRET distinct du SIREN) et NAF. En sus cette entité est liée à l&rsquo;entité de référence T_R_FORME_JURIDIQUE_FDJ qui permet de préciser la nature de la personne morale (SA, SARL, SAS, EURL, Nom propre, Collectivité Locale, Association&#8230;)</p>
<p>L&rsquo;entité <strong>T_E_PERSONNE_PHYSIQUE_PPQ</strong> concentre les données de la personne physique et en particulier son nom de naissance (un abus de langage serait de nommer cet attribut <em>nom de jeune fille</em>, car depuis plusieurs années, un homme peut prendre le nom de sa femme au moment du mariage). Le découpage de la date de naissance en trois rubrique peut paraître curieux, mais il existe encore de nombreuses personne de part le monde pour lesquels la date de naissance est incertaine (souvent juste l&rsquo;année, parfois, l&rsquo;année et le mois) naissant dans des pays ou l&rsquo;état civil n&rsquo;est pas aussi moderne que celui des pays civilisés (au_ vrai sens du terme pour une fois !). Enfin un attribut permet de renseigner le lieu de naissance qui peut être une ville, un lieudit, une région, un état&#8230; et pour compléter cette information, un lien d&rsquo;association a été fait avec l&rsquo;entité externe des pays (la structure de cette entité étant dépendante de celle de l&rsquo;INSEE).<br />
Enfin, cette entité est liée à l&rsquo;entité de référence des sexes et celle des civilités. On me demande toujours pourquoi faire une table des sexe supposée ne contenir que deux lignes&#8230; Et je répond toujours : une base de données doit contenir toutes les données sous forme explicite. Comment alors faire figurer les mots &laquo;&nbsp;Homme&nbsp;&raquo; et &laquo;&nbsp;Femme&nbsp;&raquo; sans cela ? Directement dans l&rsquo;entité des personnes physiques ? Mais alors ce sont des milliers d&rsquo;octets en pure perte !</p>
<p>On peut être stupéfait de ne pas voir figurer de prénom dans l&rsquo;entité des personnes. Mais on doit considérer qu&rsquo;une personne possède généralement plusieurs prénoms, l&rsquo;un étant le prénom usuel. De plus certains prénoms peuvent être composés. C&rsquo;est la raison pour laquelle on a préféré faire figurer l&rsquo;ensemble des prénoms d&rsquo;une personne dans une entité de nom <strong>T_E_PRENOMMEE_PNM</strong> liée aux entités contenant la personne et tous les prénoms. Dans cette entité, figurent différents attributs qui ont les rôles suivants :</p>
<ul>
<li>PNM_USUEL : booléen. Si oui, alors le prénom est usuel</li>
<li>PNM_ORDRE : entier positif. Spécifie l&rsquo;ordre d&rsquo;état civil des prénoms</li>
<li>PNM_COMPOSE : booléen. Si oui, alors le prénom qui suit est lié au précédent (Jean-Marc par exemple).</li>
</ul>
<p>Nous donnerons plus loin un petit exemple de contenu de cette entité lors de la visite du modèle physique.</p>
<p>L&rsquo;entité <strong>T_E_TELEPHONE_TEL</strong> ne contient que les numéros de téléphone, mais elle est associé à une entité de référence des types de téléphone afin de préciser s&rsquo;il s&rsquo;agit d&rsquo;une téléphone fixe, un fax ou un mobile. Notez l&rsquo;attribut TEL_CAL_NUM_INVERSE qui reprend le numéro de téléphone, mais en le nettoyant des caractères parasites et en l&rsquo;inversant et ce afin de faciliter les recherches.</p>
<p>L&rsquo;entité <strong>T_E_MAIL_EML</strong> contient uniquement la partie &laquo;&nbsp;nom d&rsquo;utilisateur&nbsp;&raquo; d&rsquo;un mail (c&rsquo;est à dire la partie devant l&rsquo;arobase), sans le DNS qui lui, figure dans l&rsquo;entité des DNS (sans l&rsquo;arobase) <strong>T_E_DNS</strong>. Bien entendu, une vue permettra de reconstituer le mail tel qu&rsquo;on a l&rsquo;habitude de le présenter. </p>
<p>Téléphones et mails (et nous le verrons aussi les adresses) peuvent être localisés, c&rsquo;est à dire correspondre à une situation particulière, telle que <em>domicile, bureau, résidence secondaire&#8230;</em> pour une personne physique, ou bien à un service, tel que <em>facturation, comptabilité, administration, ventes, direction</em>&#8230; pour une personne morale. C&rsquo;est pour cela que ces entités sont liées à l&rsquo;entité de référence <strong>T_R_LOCALISATION_LCL</strong>.<br />
De même, un téléphone fixe ou un fax peut correspondre à une adresse et c&rsquo;est le sens donné par l&rsquo;association <em>&laquo;&nbsp;situé à&nbsp;&raquo;</em>. Bien entendu cela ne peut s&rsquo;appliquer à un mobile ni à un mail par définition.</p>
<p>Enfin, une personne peut avoir plusieurs mails, fax, téléphones fixe, mais il est éventuellement souhaitable qu&rsquo;on sache parmi tous ces fax quel est celui utilisable de préférence ou à défaut. C&rsquo;est le sens donné par les trois associations &laquo;&nbsp;<em>défaut</em>&nbsp;&raquo; s&rsquo;appliquant au téléphone fixe au fax et au mail, mais pas au mobile !</p>
<p><strong>NOTA</strong> : pour gérer les particularités de situation des téléphones fixes mais pas des mobiles, il faudra procéder par contraintes.</p>
<p><strong>1.2 &#8211; Contraintes :</strong></p>
<p><strong>Les principales contraintes de <em>domaine </em>sont les suivantes :</strong></p>
<p><em>Booléens :</em></p>
<p>Les booléens <em>XXX</em>_BASE des tables de référence, comme ceux de l&rsquo;association <em>prénommée</em> (PPN_USUEL et PPN_COMPOSE) doivent avoir comme valeur par défaut FAUX.</p>
<p><em>Pour les tables de référence :</em></p>
<p><em>XXX_</em>ORDRE : positif. Ceci se fait par exemple à l&rsquo;aide de la contrainte de validation :<br />
<code class="codecolorer text default"><span class="text">CHECK (VALUE &amp;gt; 0)</span></code></p>
<p><em>Pour la personne morale :</em></p>
<p>PMR_SIREN et PMR_ETS sont composés de caractères numériques. Ceci se fait par exemple à l&rsquo;aide de la contrainte de validation :<br />
<code class="codecolorer text default"><span class="text">CHECK (VALUE = CAST(VALUES AS DECIMAL(n, 0))</span></code><br />
n valant 9 pour un SIREN et 5 pour un ETS.</p>
<p>Le code NAF doit être composé de 4 chiffres + une lettre. La contrainte de validation est alors la suivante :</p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">CHECK ( &nbsp; &nbsp;CAST(SUBSTRING(VALUE FROM 1 FOR 4) AS SMALLINT) = SUBSTRING(VALUE FROM 1 FOR 4) <br />
&nbsp; &nbsp; &nbsp; &nbsp;AND SUBSTRING(VALUE FROM 5 FOR 1) COLLATE French_CS_AS BETWEEN 'A' AND 'Z')</div></div>

</pre>
<p><em>Pour la personne physique :</em></p>
<p>On vérifiera que les noms (naissance et marital) ainsi que le lieu soient composés de lettres (y compris accentuées) et en majuscules avec les éventuels caractères blanc, tiret et apostrophe, mais ne figrant ni au début ni en fin de chaine. Ceci peut être fait à l&rsquo;aide une UDF (par exemple F_RESCRIT décrite <a href="http://blog.developpez.com/sqlpro/p7392/langage-sql-norme/qualite-des-donnees-une-fonction-de-corr/">ici</a>) associée à la contrainte de validation suivante :</p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">CHECK (VALUE = F_RESCRIT(VALUE, &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'-'' àáâãäæçèéêëìíîïñòóôõöœùúûüýœabcçdefghijklmnopqrstuvwxyzÀÁÂÃÄÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝŒABCDEFGHIJKLMNOPQRSTUVWXYZ', &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'-'' ÀÁÂÃÄÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖŒÙÚÛÜÝŒABCCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝŒABCDEFGHIJKLMNOPQRSTUVWXYZ', &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'- '''))</div></div>

</pre>
<p>Les attributs PPQ_NAISSANCE_&#8230; doivent être aussi validés comme suit :<br />
CHECK (PPQ_AN BETWEEN 1880 AND EXTRACT(YEAR FROM CURRENT_DATE)))<br />
CHECK (PPQ_MOIS BETWEEN 1 AND 12)<br />
CHECK (PPQ_JOUR BETWEEN 1 AND 31)<br />
Mais nous verrons un peu plus loin, à la rubrique contrainte de table, que ceci ne suffit pas à garantir des saisies erronées&#8230;</p>
<p><em>Pour les téléphones : </em></p>
<p>L&rsquo;attribut TEL_NUM ne doit être composé que de nombres mais on peut admettre les caractères point, tiret ou blanc afin de faciliter la lecture. Dans ce cas on validera avec la fonction F_RESCRIT de la manière suivante :</p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">CHECK (VALUE = F_RESCRIT(VALUE, &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'-. 0123456789', &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'-. 0123456789', &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'- .'))</div></div>

</pre>
<p>L&rsquo;attribut TEL_CALC_NUM_INVERSE ne doit être composé que de nombres. On pourra le valider à l&rsquo;aide de la contrainte de validation suivante :<br />
<code class="codecolorer text default"><span class="text">CHECK (VALUES = CAST(VALUE AS DECIMAL(20,0))</span></code></p>
<p><strong>Les principales contraintes de <em>table</em> sont les suivantes :</strong></p>
<p><em>Pour toutes les tables de référence</em> : l&rsquo;attribut <em>XXX_</em>CODE doit être unique.</p>
<p>Pour la table des personne morales, le code SIRET doit être unique :<br />
<code class="codecolorer text default"><span class="text">UNIQUE (PMR_SIREN, PMR_ETS)</span></code></p>
<p><em>Pour les dates de naissance</em> : plusieurs cas doivent être envisagés :<br />
1) année seule<br />
2) année + mois<br />
3) année + mois + jour correspondant à une date valide<br />
Toutes les autres combinaisons doivent être exclues</p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">CHECK (CASE <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WHEN PPQ_NAISSANCE_AN IS NOT NULL AND PPQ_NAISSANCE_MOIS IS NULL AND PPQ_NAISSANCE_JOUR IS NULL &nbsp; &nbsp; THEN 1 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WHEN PPQ_NAISSANCE_AN IS NOT NULL AND PPQ_NAISSANCE_MOIS IS NOT NULL &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;THEN 1 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WHEN PPQ_NAISSANCE_AN IS NOT NULL AND PPQ_NAISSANCE_MOIS IS NOT NULL AND PPQ_NAISSANCE_JOUR IS NOT NULL &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AND CAST(CAST(PPQ_NAISSANCE_AN AS VARCHAR(4)) || '- ' &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; || CAST(CAST(PPQ_NAISSANCE_MOIS AS VARCHAR(2)) || '- ' &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; || CAST(CAST(PPQ_NAISSANCE_JOUR AS VARCHAR(2)) AS DATE) BETWEEN '1880-01-01' AND CURENT_DATE) THEN 1 <br />
&nbsp; &nbsp; &nbsp; &nbsp;END) = 1 )</div></div>

</pre>
<p><strong>Les principales <em>assertions</em> sont les suivantes :</strong></p>
<p>Gestion de l&rsquo;héritage exclusif : une personne morale ne pet être une personne physique&#8230;<br />
Se traduit par :</p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">CHECK (NOT EXISTS(SELECT * <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FROM &nbsp; T_E_PERSONNE_PHYSIQUE_PPQ AS P <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; INNER JOIN T_E_PERSONNE_MORALE_PMR AS M <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ON P.PRS_ID = M.PRS_ID)</div></div>

</pre>
<p>Gestion des informations spécifiques aux téléphones non mobiles :<br />
Il ne faut pas de localisation par adresse pour un mobile :</p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">CHECK (NOT EXISTS(SELECT * <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FROM &nbsp; T_E_TELEPHONE_TEL AS T <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;INNER JOIN T_R_TELEPHONE_TYPE_TPT AS P <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ON T.TPT_ID = P.TPT_ID <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WHERE &nbsp;ADR_ID IS NOT NULL <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AND &nbsp;TPT_CODE = 'MOBILE')</div></div>

</pre>
<p><strong>1.3 &#8211; Supplément :</strong></p>
<p>On pourrait rajouter à ce modèle un lien entre personne morale et personne physique car une personne morale doit toujours être représentée par une personne physique. Ce &laquo;&nbsp;lien&nbsp;&raquo; pourrait être le suivant :<br />
<img src="http://blog.developpez.com/media/MCD_Personne_Represente_small.gif" width="789" height="275" alt="MCD représentation d'une personne morale par une personne physique" /><br />
<em>Pour une image plus grande, cliquez <a href="http://blog.developpez.com/media/MCD_Personne_Represente.gif">ici</a></em></p>
<p><em>Une personne ne saurait être suffisamment détaillée sans ses adresses. Le prochain article sur la modélisation des personnes portera sur la modélisation des adresses relatives aux personnes&#8230;</em></p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">-------- <br />
Frédéric Brouard, SQLpro - ARCHITECTE DE DONNÉES, http://sqlpro.developpez.com/ <br />
Expert bases de données relationnelles et langage SQL. MVP Microsoft SQL Server <br />
www.sqlspot.com : modélisation, conseil, audit, optimisation, tuning, formation <br />
* * * * * &nbsp;Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence &nbsp;* * * * *</div></div>

</pre>
<p><img src="http://blog.developpez.com/media/Microsoft_MVP_logo_vertical Brouard 400.jpg" width="400" height="135" alt="MVP Microsoft SQL Server" /> </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Modélisation euromillions</title>
		<link>https://blog.developpez.com/exercices-sql/p9779/exercices-sql/modelisation_euromillions</link>
		<comments>https://blog.developpez.com/exercices-sql/p9779/exercices-sql/modelisation_euromillions#comments</comments>
		<pubDate>Tue, 01 Mar 2011 20:15:02 +0000</pubDate>
		<dc:creator><![CDATA[SQLpro]]></dc:creator>
				<category><![CDATA[Exercices SQL]]></category>
		<category><![CDATA[Modèle de données]]></category>
		<category><![CDATA[SQL pur]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[En une seule table, créez le modèle permettant de saisir autant de grille que l&#8217;on souhaite. Prévoyez toutes les contraintes afin qu&#8217;aucune saisie ne puisse être fausse. Écrivez une procédure pour générer automatiquement n grilles avec des numéros et des étoiles choisies au hasard. Chaque grille comporte 5 numéros compris entre 1 et 50 inclus et 2 étoiles comprises entre 1 et 11. Bien entendu, dans une même grille, il ne peut y avoir deux [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>En une seule table, créez le modèle permettant de saisir autant de grille que l&rsquo;on souhaite. Prévoyez toutes les contraintes afin qu&rsquo;aucune saisie ne puisse être fausse. Écrivez une procédure pour générer automatiquement n grilles avec des numéros et des étoiles choisies au hasard.<br />
<span id="more-5"></span><br />
Chaque grille comporte 5 numéros compris entre 1 et 50 inclus et 2 étoiles comprises entre 1 et 11.<br />
Bien entendu, dans une même grille, il ne peut y avoir deux numéros identique, ni deux étoiles identiques.</p>
<p><strong>SOLUTION&#8230;</strong></p>
<p><strong>La table :</strong></p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">CREATE TABLE T_GRILLE_EUROMILLION_GEM <br />
(GEM_ID &nbsp; &nbsp; &nbsp;INT &nbsp; &nbsp; &nbsp;NOT NULL IDENTITY PRIMARY KEY, <br />
&nbsp;GEM_GRILLE &nbsp;INT &nbsp; &nbsp; &nbsp;NOT NULL, <br />
&nbsp;GEM_TYPE &nbsp; &nbsp;CHAR(6) &nbsp;NOT NULL CHECK (GEM_TYPE IN ('ETOILE', 'NUMERO')), <br />
&nbsp;GEM_RANG &nbsp; &nbsp;TINYINT &nbsp;NOT NULL CHECK (GEM_RANG &gt; 0), <br />
&nbsp;GEM_NUMERO &nbsp;TINYINT &nbsp;NOT NULL CHECK (GEM_NUMERO &gt; 0), <br />
&nbsp;CONSTRAINT CK_TYPE_NUM CHECK ( &nbsp; &nbsp;(GEM_TYPE = 'ETOILE' AND GEM_NUMERO &lt;=11 ) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OR (GEM_TYPE = 'NUMERO' AND GEM_NUMERO &lt;=50)), <br />
&nbsp;CONSTRAINT CK_TYPE_RNG CHECK ( &nbsp; &nbsp;(GEM_TYPE = 'ETOILE' AND GEM_RANG &lt;=2 ) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OR (GEM_TYPE = 'NUMERO' AND GEM_RANG &lt;=5)), <br />
&nbsp;CONSTRAINT UK_ID_TYP_NUM UNIQUE (GEM_GRILLE, GEM_TYPE, GEM_NUMERO), <br />
&nbsp;CONSTRAINT UK_ID_TYP_RNG UNIQUE (GEM_GRILLE, GEM_TYPE, GEM_RANG)); &nbsp; &nbsp;<br />
GO</div></div>

</pre>
<p><strong>La procédure</strong></p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">CREATE PROCEDURE P_LOTO_EUROMILLION @N smallint <br />
AS <br />
DECLARE @MAXGRL INT, @NEWGRL INT, <br />
&nbsp; &nbsp; &nbsp; &nbsp; @NG INT, @NE TINYINT, @NN TINYINT; <br />
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; <br />
BEGIN TRANSACTION; <br />
SELECT @NEWGRL = MAX(GEM_GRILLE) + 1 FROM T_GRILLE_EUROMILLION_GEM; &nbsp; &nbsp;<br />
IF @NEWGRL IS NULL &nbsp;<br />
&nbsp; &nbsp; &nbsp; SET @NEWGRL = 1; <br />
SET @MAXGRL = @NEWGRL &nbsp; &nbsp; &nbsp; <br />
-- boucle sur nombre de grilles <br />
SET @NG = 1; <br />
WHILE @NG &lt;= @N <br />
BEGIN <br />
&nbsp; &nbsp;SET @NN = 1 <br />
&nbsp; &nbsp;BEGIN TRY <br />
&nbsp; &nbsp;-- boucle sur nombre de numero (5) <br />
&nbsp; &nbsp;WHILE NOT EXISTS(SELECT * <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FROM &nbsp; T_GRILLE_EUROMILLION_GEM <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WHERE &nbsp;GEM_GRILLE = @MAXGRL <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AND &nbsp;GEM_RANG = 5 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AND &nbsp;GEM_TYPE = 'NUMERO') <br />
&nbsp; &nbsp; &nbsp; INSERT INTO T_GRILLE_EUROMILLION_GEM <br />
&nbsp; &nbsp; &nbsp; SELECT @MAXGRL, 'NUMERO', COALESCE(MAX(GEM_RANG) + 1, 1), &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CAST(FLOOR(1 + (RAND() * 50)) AS TINYINT) <br />
&nbsp; &nbsp; &nbsp; FROM &nbsp; T_GRILLE_EUROMILLION_GEM <br />
&nbsp; &nbsp; &nbsp; WHERE &nbsp;GEM_GRILLE = @MAXGRL <br />
&nbsp; &nbsp; &nbsp; &nbsp; AND &nbsp;GEM_TYPE = 'NUMERO'; <br />
&nbsp; &nbsp;-- boucle sur nombre d'étoile (5) <br />
&nbsp; &nbsp;WHILE NOT EXISTS(SELECT * <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FROM &nbsp; T_GRILLE_EUROMILLION_GEM <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WHERE &nbsp;GEM_GRILLE = @MAXGRL <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AND &nbsp;GEM_RANG = 2 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AND &nbsp;GEM_TYPE = 'ETOILE') <br />
&nbsp; &nbsp; &nbsp; INSERT INTO T_GRILLE_EUROMILLION_GEM <br />
&nbsp; &nbsp; &nbsp; SELECT @MAXGRL, 'ETOILE', COALESCE(MAX(GEM_RANG) + 1, 1), &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CAST(FLOOR(1 + (RAND() * 11)) AS TINYINT) <br />
&nbsp; &nbsp; &nbsp; FROM &nbsp; T_GRILLE_EUROMILLION_GEM <br />
&nbsp; &nbsp; &nbsp; WHERE &nbsp;GEM_GRILLE = @MAXGRL <br />
&nbsp; &nbsp; &nbsp; &nbsp; AND &nbsp;GEM_TYPE = 'ETOILE'; <br />
&nbsp; &nbsp;SELECT @NG = @NG + 1, @MAXGRL = @MAXGRL + 1; <br />
&nbsp; &nbsp;END TRY <br />
&nbsp; &nbsp;BEGIN CATCH <br />
&nbsp; &nbsp;END &nbsp; CATCH <br />
END <br />
COMMIT TRANSACTION ; <br />
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; <br />
SELECT GEM_GRILLE, GEM_TYPE, GEM_NUMERO <br />
FROM &nbsp; T_GRILLE_EUROMILLION_GEM <br />
WHERE &nbsp;GEM_GRILLE &gt;= @NEWGRL <br />
ORDER BY GEM_GRILLE, GEM_TYPE DESC, GEM_NUMERO <br />
GO</div></div>

</pre>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">-------- <br />
Frédéric Brouard, SQLpro - ARCHITECTE DE DONNÉES, http://sqlpro.developpez.com/ <br />
Expert bases de données relationnelles et langage SQL. MVP Microsoft SQL Server <br />
www.sqlspot.com : modélisation, conseil, audit, optimisation, tuning, formation <br />
* * * * * &nbsp;Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence &nbsp;* * * * *</div></div>
<p><img src="http://blog.developpez.com/media/Microsoft_MVP_logo_vertical Brouard 400.jpg" width="400" height="135" alt="MVP Microsoft SQL Server" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exercice de modélisation : secrétariat médical</title>
		<link>https://blog.developpez.com/exercices-sql/p9450/exercices-sql/modele-de-donnees/exercice_de_modelisation_secretariat_med_1</link>
		<comments>https://blog.developpez.com/exercices-sql/p9450/exercices-sql/modele-de-donnees/exercice_de_modelisation_secretariat_med_1#comments</comments>
		<pubDate>Wed, 03 Nov 2010 21:57:04 +0000</pubDate>
		<dc:creator><![CDATA[SQLpro]]></dc:creator>
				<category><![CDATA[Modèle de données]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Le cabinet médical du Mourillon désire d&#8217;équiper d&#8217;une solution informatique de gestion du planning des rendez-vous et pour cela vous confie la mission de modéliser la base de données nécessaire à cette activité. Le cabinet compte actuellement 4 médecins et 5 salles d&#8217;auscultation et compte s&#8217;agrandir dans l&#8217;avenir. De temps à autre un médecin remplaçant prend des vacations journalières pour remplacer les médecins malades ou en vacances. Il y a des rendez-vous au cabinet et [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Le cabinet médical du Mourillon désire d&rsquo;équiper d&rsquo;une solution informatique de gestion du planning des rendez-vous et pour cela vous confie la mission de modéliser la base de données nécessaire à cette activité.<br />
<span id="more-8"></span><br />
Le cabinet compte actuellement 4 médecins et 5 salles d&rsquo;auscultation et compte s&rsquo;agrandir dans l&rsquo;avenir. De temps à autre un médecin remplaçant prend des vacations journalières pour remplacer les médecins malades ou en vacances.<br />
Il y a des rendez-vous au cabinet et des rendez-vous sur place (chez le patient).</p>
<p>Chaque médecin à des jours et des horaires de présence différents sur la semaine.<br />
Par exemple le docteur Bondu travaille le lundi, le mercredi et le jeudi de 9h à 12h30 puis de 14h à 19h. Le mardi de 14h30 à 20h et le samedi de 8h à 13h. Les lundi, mercredi et jeudi matin sont consacré à des visites chez les patients. Le reste du temps il est au cabinet.<br />
Pour le docteur Pochet, il travaille du mardi au samedi avec les mêmes horaires : de 10h à 19h. Les mardi, jeudi et vendredi il visite ses patients.</p>
<p>Bien entendu il y a les vacances, c&rsquo;est à, dire des jours pendant lesquels certains médecins ne travaillent pas.</p>
<p>Les rendez-vous au cabinet ont lieu pour un même médecin dans la même salle au cours de la journée.</p>
<p>La fréquence des rendez-vous a été fixée comme suit : pour les visites sur place des patients, une fois par 20 minutes. Pour les rendez-vous en cabinet, une fois toutes les 10 minutes.</p>
<p>Sur le planning doit figurer : </p>
<ul>
<li>les horaires de disponibilité de chacun des médecins;</li>
<li>les rendez-vous déjà fixé;</li>
<li>les créneaux de rendez-vous disponible;</li>
<li>le type de rendez-vous possible par plage (sur place ou au cabinet);</li>
<li>le nom du patient qui a rendez-vous;</li>
</ul>
<p>En outre il a été demandé que l&rsquo;on puisse saisir l&rsquo;heure exacte d&rsquo;arrivée du patient au cabinet et l&rsquo;heure de passage en salle d&rsquo;auscultation afin de connaître le temps d&rsquo;attente moyen. De la même façon, le système doit permettre de saisir l&rsquo;heure exacte à laquelle le médecin est arrivé chez son patient pour un rendez-vous sur place.</p>
<p>Il ne faut pas que :</p>
<ul>
<li>un même médecin ait deux rendez-vous avec deux patients différents le même jour à la même heure.</li>
<li>une salle d&rsquo;auscultation soit occupée par deux médecins en même temps.</li>
</ul>
<p>Sur le patient on collectera les informations suivantes : nom, prénom, sexe, date de naissance, téléphone, adresse.</p>
<p><strong>Travail à faire :</strong></p>
<p>Il vous est demandé de présenter un modèle conceptuel de données assorti des contraintes et des règles afférentes au modèle élaboré.</p>
<p><strong>SOLUTION</strong></p>
<p><strong>1 &#8211; Le modèle conceptuel de données :</strong><br />
<img src="http://blog.developpez.com/media/MCD_secretariat_medical.gif" width="944" height="533" alt="MCD secrétariat médical" /></p>
<p><em><strong>Description des principales entités :</strong><br />
</em><br />
CALENDRIER est une entité comprenant toutes les dates.<br />
CHRONO est une entité contenant tous les horaires de rendez-vous au pas horaire spécifié (10 minutes) avec indication booléenne s&rsquo;il s&rsquo;agit d&rsquo;un créneau de RV au domicile (un tuple sur deux), soit toutes les 20 minutes.<br />
RV est une entité faible composé de liens identifiants provenant des entités PATIENT, MEDECIN, CALENDRIER  et CHRONO,<br />
OCCUPATION est entité faible composé de liens identifiants provenant des entités CALENDRIER, SALLE, MEDECIN<br />
JOUR_DE_SEMAINE est une entité contenant les 7 jours de la semaine.<br />
PRESENT est une entité partiellement faible composée d&rsquo;un attribut clef (PSC_HEURE_DEBUT) et de liens identifiants provenant des entités JOUR_DE_SEMAINE et MEDECIN </p>
<p><em><strong>Description des principales associations :</strong></em></p>
<p><em>remplace</em> est une association ternaire portant sur un médecin, son remplaçant et une date.<br />
<em>absent</em> est une association n:m qui spécifie à quelles date les médecins sont absents.</p>
<p><strong>2 &#8211; Le modèle physique de données (version MS SQL Server) :</strong><br />
<img src="http://blog.developpez.com/media/MPD_secretariat_medical.gif" width="954" height="764" alt="Modèle physique de données secétariat médical" /></p>
<p><em><strong>Contraintes :</strong></em><br />
Les contraintes à mettre en œuvre sont les suivantes :<br />
1) un médecin ne peut se remplacer lui même (exclusion entre PRS_ID_REMPLACE et PRS_ID_REMPLACANT dans la table de jointure &laquo;&nbsp;remplace&nbsp;&raquo;)<br />
2) une heure de fin doit être supérieure à une heure de début (PSC_HEURE_DEBUT inférieure à PSC_HEURE_FIN dans la table PRESENT)<br />
3) différentes périodes de présence ne peuvent se recoupées pour un même médecin à un même jour de semaine (dans la table PRESENT).<br />
Cette dernière contrainte est assez complexe et peut se résumer à une assertion du genre :</p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">CREATE ASSERTION A_PRESENCE_NON_RECOUVRANTE <br />
AS <br />
&nbsp; &nbsp;CHECK (NOT EXISTS(SELECT * <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FROM &nbsp; PRESENT AS P1 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; INNER JOIN PRESENT AS P2 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ON &nbsp; &nbsp; P1.PRS_ID = P2.PRS_ID <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AND P1.JSM_ID = P2.JSM_ID <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AND ( &nbsp; &nbsp;(P2.PSC_HEURE_DEBUT &gt;= P1.PSC_HEURE_DEBUT AND P2.PSC_HEURE_DEBUT &lt; P1.PSC_HEURE_FIN) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;OR (P2.PSC_HEURE_FIN &nbsp; &gt;= P1.PSC_HEURE_DEBUT AND P2.PSC_HEURE_FIN &nbsp; &lt; P1.PSC_HEURE_FIN))))</div></div>

</pre>
<p><strong>NOTA </strong>: pour toutes les problématiques de planning, des vues suffisent. Par exemple l&rsquo;ensemble des créneaux disponible par médecin peut se faire par un produit cartésien des jours de semaine avec le chrono restreint sur les plages de présence et auquel on soustrait (par l&rsquo;opérateur ensembliste EXCEPT) les RV déjà pris. </p>
<p>&#8212;&#8212;&#8211;<br />
Frédéric BROUARD, Spécialiste modélisation, bases de données, optimisation, langage SQL.<br />
Le site sur le langage SQL et les S.G.B.D. relationnels : http://sqlpro.developpez.com/<br />
Expert SQL Server http://www.sqlspot.com : audit, optimisation, tuning, formation<br />
* * * * * Enseignant au CNAM PACA et à l&rsquo;ISEN à Toulon * * * * *</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cahier d&#8217;exercices SQL N°1</title>
		<link>https://blog.developpez.com/exercices-sql/p7156/exercices-sql/cahier_d_xercices_sql_nd1</link>
		<comments>https://blog.developpez.com/exercices-sql/p7156/exercices-sql/cahier_d_xercices_sql_nd1#comments</comments>
		<pubDate>Mon, 02 Feb 2009 16:45:25 +0000</pubDate>
		<dc:creator><![CDATA[SQLpro]]></dc:creator>
				<category><![CDATA[Exercices SQL]]></category>
		<category><![CDATA[SQL pur]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Premier cahier d&#8217;exercices de requêtes SQL&#8230; 7 requêtes à former pour une base de données de boîte mail. Les modèles de données (MCD Merise, MPD) ci dessous présente un système de boîte aux lettres pour courrier électronique. La table des mails contient tous les mails de tous les comptes relatifs à l&#8217;application cliente. La table des comptes liste les différents comptes mails de la boîte aux lettres. La table des pièces jointes contient les différentes [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Premier cahier d&rsquo;exercices de requêtes SQL&#8230; 7 requêtes à former pour une base de données de boîte mail.<br />
<span id="more-1"></span></p>
<p><strong>Les modèles de données (MCD Merise, MPD) ci dessous présente un système de boîte aux lettres pour courrier électronique.<br />
</strong><br />
La table des mails contient tous les mails de tous les comptes relatifs à l&rsquo;application cliente. La table des comptes liste les différents comptes mails de la boîte aux lettres. La table des pièces jointes contient les différentes PJ relative à un mail.<br />
La table des adresses mails contient à la fois les adresses mails des comptes de la boîte aux lettres ainsi que toutes les adresses mail du carnet d&rsquo;adresse.<br />
Veuillez noter que pour les adresses mail, on stocke la partie DNS dans la table DNS et la partie spécifique (nom ou pseudonyme de la personne) dans la table des adresses mail.</p>
<p><img src="http://blog.developpez.com/media/ModelelMaiMcd.gif" width="1167" height="856" alt="MCD mail" /><br />
<em>Modèle Conceptuel de Données : boîte mail</em></p>
<p><img src="http://blog.developpez.com/media/ModeleMailMpd.gif" width="1320" height="814" alt="MPD mail" /><br />
<em>Modèle Physique de Données : boîte mail</em></p>
<p>Voici le dessin SQL (DDL) des tables de ce modèle :</p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">/*==============================================================*/ <br />
/* Table : T_ADRESSE_EMAIL_ADM &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/ <br />
/*==============================================================*/ <br />
create table T_ADRESSE_EMAIL_ADM ( <br />
&nbsp; &nbsp;ADM_ID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;not null, <br />
&nbsp; &nbsp;DNS_ID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;not null, <br />
&nbsp; &nbsp;CML_ID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;null, <br />
&nbsp; &nbsp;ADM_COMPTE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; char(128) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;not null, <br />
&nbsp; &nbsp;ADM_NOM &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;varchar(256) &nbsp; &nbsp; &nbsp; &nbsp; null, <br />
&nbsp; &nbsp;constraint PK_ADM primary key &nbsp;(ADM_ID)); <br />
&nbsp;<br />
/*==============================================================*/ <br />
/* Table : T_COMPTE_EMAIL_CML &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; */ <br />
/*==============================================================*/ <br />
create table T_COMPTE_EMAIL_CML ( <br />
&nbsp; &nbsp;CML_ID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;not null, <br />
&nbsp; &nbsp;ADM_ID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;not null, <br />
&nbsp; &nbsp;CML_USER_NAME &nbsp; &nbsp; &nbsp; &nbsp;char(64) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; not null, <br />
&nbsp; &nbsp;CML_PASSWORD &nbsp; &nbsp; &nbsp; &nbsp; char(32) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; not null, <br />
&nbsp; &nbsp;CML_SERVER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; char(64) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; not null, <br />
&nbsp; &nbsp;constraint PK_CML primary key &nbsp;(CML_ID)); <br />
&nbsp;<br />
/*==============================================================*/ <br />
/* Table : T_DNS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/ <br />
/*==============================================================*/ <br />
create table T_DNS ( <br />
&nbsp; &nbsp;DNS_ID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;not null, <br />
&nbsp; &nbsp;DNS_NAME &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; char(128) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;not null, <br />
&nbsp; &nbsp;constraint PK_DNS primary key &nbsp;(DNS_ID)); <br />
&nbsp;<br />
/*==============================================================*/ <br />
/* Table : T_EMAIL_EML &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/ <br />
/*==============================================================*/ <br />
create table T_EMAIL_EML ( <br />
&nbsp; &nbsp;MEL_GUID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UNIQUEIDENTIFIER &nbsp; &nbsp; not null, &nbsp;--&gt; GUID <br />
&nbsp; &nbsp;MEL_GUID_ORIGINE &nbsp; &nbsp; UNIQUEIDENTIFIER &nbsp; &nbsp; null, &nbsp; &nbsp; &nbsp;--&gt; GUID <br />
&nbsp; &nbsp;ADM_ID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;null, <br />
&nbsp; &nbsp;CML_ID_RECUT &nbsp; &nbsp; &nbsp; &nbsp; int &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;null, <br />
&nbsp; &nbsp;CML_ID_ENVOI &nbsp; &nbsp; &nbsp; &nbsp; int &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;null, <br />
&nbsp; &nbsp;MEL_DATEHEURE &nbsp; &nbsp; &nbsp; &nbsp;timestamp &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;null, <br />
&nbsp; &nbsp;MEL_TITRE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;varchar(256) &nbsp; &nbsp; &nbsp; &nbsp; null, <br />
&nbsp; &nbsp;MEL_CORPS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;varchar(max) &nbsp; &nbsp; &nbsp; &nbsp; null, <br />
&nbsp; &nbsp;MEL_PRIORITE &nbsp; &nbsp; &nbsp; &nbsp; smallint &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; null, <br />
&nbsp; &nbsp;MEL_ACCUSE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; boolean &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;null, <br />
&nbsp; &nbsp;constraint PK_EML primary key &nbsp;(MEL_GUID)); <br />
&nbsp;<br />
/*==============================================================*/ <br />
/* Table : T_PIECE_JOINTE_PCJ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; */ <br />
/*==============================================================*/ <br />
create table T_PIECE_JOINTE_PCJ ( <br />
&nbsp; &nbsp;PCJ_ID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;not null, <br />
&nbsp; &nbsp;MEL_GUID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UNIQUEIDENTIFIER &nbsp; &nbsp; not null, &nbsp;--&gt; GUID <br />
&nbsp; &nbsp;PCJ_NOM_FICHIER &nbsp; &nbsp; &nbsp;varchar(256) &nbsp; &nbsp; &nbsp; &nbsp; not null, <br />
&nbsp; &nbsp;PCJ_TYPE_CONTENU &nbsp; &nbsp; char(32) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; null, <br />
&nbsp; &nbsp;PCJ_CONTENU &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nvarchar(255) &nbsp; &nbsp; &nbsp; &nbsp;not null, <br />
&nbsp; &nbsp;constraint PK_PCJ primary key &nbsp;(PCJ_ID)); <br />
&nbsp;<br />
/*==============================================================*/ <br />
/* Table :T_J_MAIL_ENVOYE_ADRESSE_MEA &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; */ <br />
/*==============================================================*/ <br />
create table T_J_MAIL_ENVOYE_ADRESSE_MEA ( <br />
&nbsp; &nbsp;ADM_ID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;not null, <br />
&nbsp; &nbsp;MEL_GUID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UNIQUEIDENTIFIER &nbsp; &nbsp; not null, &nbsp;--&gt; GUID <br />
&nbsp; &nbsp;constraint PK_MEA primary key &nbsp;(ADM_ID, MEL_GUID));</div></div>

</pre>
<p><strong>NOTA -</strong> <em>vous pouvez remplacer les types suivants :</em></p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">UNIQUEIDENTIFIER &nbsp; par CHAR(36) <br />
boolean &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;par SMALLINT (ou BIT)</div></div>

</pre>
<p><strong>Veuillez traduire en requête SQL, les demandes ci dessous :</strong></p>
<p><strong>1.1 &#8211; </strong>Combien de courriels ont été reçut pour le compte &laquo;&nbsp;chris.date@ibm.com&nbsp;&raquo; au cours du mois de juillet 2008 ?</p>
<p><strong>1.2 &#8211; </strong>Comptez le nombre d&rsquo;adresse mail du carnet d&rsquo;adresse par rapport aux différents serveurs DNS</p>
<p><strong>1.3 &#8211; </strong>Créez la vue permettant de reconstituer l&rsquo;ensemble des adresses mails avec le compte mail complet (y compris l&rsquo;arobase) en ajoutant une colonne booléenne indiquant si l&rsquo;adresse est un compte mail.</p>
<p><strong>1.4 &#8211; </strong>Créez la contrainte CHECK de la table T_EMAIL_EML afin de faire en sorte de respecter la règle mentionnée dans le modèle :<br />
Si le mail est un mail envoyé alors les associations &laquo;&nbsp;envoyé par&nbsp;&raquo; et &laquo;&nbsp;envoyées à&nbsp;&raquo; sont renseignées et les associations &laquo;&nbsp;reçut pour&nbsp;&raquo; et &laquo;&nbsp;reçut de&nbsp;&raquo; ne sont pas renseigné. Dans le cas d&rsquo;un mail reçut, c&rsquo;est l&rsquo;inverse.</p>
<p><strong>1.5 &#8211; </strong>Compte tenu que les réponses à un mail peuvent s&rsquo;enchaîner de manière arborescente, quelle est la profondeur maximale attente par un même fil de discussion ?</p>
<p><strong>1.6 &#8211; </strong>de quel(s) expéditeur(s) provien(nen)t le (ou les) courriel(s) contenant le plus de pièces jointes ?</p>
<p><strong>1.7 &#8211; </strong>À combien de personnes, en moyenne, ont été envoyé les mails expédiés à plus d&rsquo;un destinataire ?</p>
<p><strong>NOTA : </strong><em>la difficulté essentielle de ces requêtes vient de la compréhension du modèle et non de la complexité des requêtes&#8230;</em></p>
<p><strong>Pour vous aider, voici le contenu d&rsquo;un jeu d&rsquo;essais :</strong></p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SELECT * FROM dbo.T_DNS <br />
&nbsp;<br />
DNS_ID &nbsp; &nbsp; &nbsp;DNS_NAME <br />
----------- --------------- <br />
0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sqlpro.fr &nbsp; &nbsp; &nbsp; <br />
1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ibm.com &nbsp; &nbsp; &nbsp; &nbsp; <br />
2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wanadoo.fr &nbsp; &nbsp; &nbsp;<br />
3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; aol.com &nbsp; &nbsp; &nbsp; &nbsp; <br />
4 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; free.fr &nbsp; &nbsp; &nbsp; &nbsp; <br />
5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; microsoft.com &nbsp; <br />
6 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; yahoo.fr <br />
&nbsp;<br />
SELECT * FROM dbo.T_ADRESSE_EMAIL_ADM <br />
&nbsp;<br />
ADM_ID &nbsp; &nbsp; &nbsp;DNS_ID &nbsp; &nbsp; &nbsp;CML_ID &nbsp; &nbsp; &nbsp;ADM_COMPTE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ADM_NOM <br />
----------- ----------- ----------- ---------------------- ------------------------ <br />
1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL &nbsp; &nbsp; &nbsp; &nbsp;chris.date &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Chris Date (IBM) <br />
2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL &nbsp; &nbsp; &nbsp; &nbsp;edgar.codd &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Edgar Codd (IBM) <br />
3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r.dupond &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; moi <br />
4 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; remy.dupond &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;remoi <br />
5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rdp &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;encore moi <br />
6 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL &nbsp; &nbsp; &nbsp; &nbsp;thierry.narguy &nbsp; &nbsp; &nbsp; &nbsp; Thierry N (copain d'avant) <br />
7 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL &nbsp; &nbsp; &nbsp; &nbsp;michele.lamarque &nbsp; &nbsp; &nbsp; Michèle, ma belle <br />
8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL &nbsp; &nbsp; &nbsp; &nbsp;james.kelly &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;JKL à New York <br />
9 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL &nbsp; &nbsp; &nbsp; &nbsp;bill.gates &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bilou mon pote <br />
&nbsp;<br />
SELECT * FROM dbo.T_COMPTE_EMAIL_CML <br />
&nbsp;<br />
CML_ID &nbsp; &nbsp; &nbsp;ADM_ID &nbsp; &nbsp; &nbsp;CML_USER_NAME &nbsp; &nbsp;CML_PASSWORD &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CML_SERVER <br />
----------- ----------- ---------------- --------------------------------- --------------- <br />
1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rdp &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;012FC685DA1420584C45FED12581C526 &nbsp;pop.sqlpro.fr <br />
2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rdp2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 45FED1258012FC680584C1C5265DA142 &nbsp;pop.sqlpro.fr <br />
3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rd &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; C1C545FE12FC6D1258080142584265DA &nbsp;pop.sqlpro.fr &nbsp;<br />
&nbsp;<br />
SELECT * FROM dbo.T_EMAIL_EML <br />
&nbsp;<br />
MEL_GUID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MEL_GUID_ORIGINE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ADM_ID &nbsp; &nbsp; &nbsp;CML_ID_RECUT CML_ID_ENVOI MEL_DATEHEURE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ... <br />
------------------------------------ ------------------------------------ ----------- ------------ ------------ ----------------------- ... <br />
C3C16F2B-F7A2-497C-A57B-5E807AA8FD8D NULL &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL &nbsp; &nbsp; &nbsp; &nbsp;NULL &nbsp; &nbsp; &nbsp; &nbsp; 2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2008-07-25 10:44:27.000 ... <br />
5478EC6B-B214-47A8-BBB5-8B9519EFD916 NULL &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NULL &nbsp; &nbsp; &nbsp; &nbsp; 2008-12-30 22:44:16.000 ... <br />
EC101A27-B1F6-4454-A171-9D3738D2D930 NULL &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL &nbsp; &nbsp; &nbsp; &nbsp;NULL &nbsp; &nbsp; &nbsp; &nbsp; 1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2009-01-01 12:31:28.000 ... <br />
BEE3F817-637D-40C7-801B-AA4A2E5CBDEB C3C16F2B-F7A2-497C-A57B-5E807AA8FD8D 2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NULL &nbsp; &nbsp; &nbsp; &nbsp; 2008-07-25 17:28:33.000 ... <br />
FEE0DE44-C7AB-43EF-BE13-D319844BF003 BEE3F817-637D-40C7-801B-AA4A2E5CBDEB NULL &nbsp; &nbsp; &nbsp; &nbsp;NULL &nbsp; &nbsp; &nbsp; &nbsp; 2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2008-07-28 10:19:11.000 ... <br />
48D688D9-50FE-48F5-8AE8-D5B063F9BF9B NULL &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL &nbsp; &nbsp; &nbsp; &nbsp;NULL &nbsp; &nbsp; &nbsp; &nbsp; 3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2009-01-01 12:31:28.000 ... <br />
24452E97-5DB8-41FB-9A32-D6131F93B38A C3C16F2B-F7A2-497C-A57B-5E807AA8FD8D 2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NULL &nbsp; &nbsp; &nbsp; &nbsp; 2008-07-25 17:12:44.000 ... <br />
&nbsp;<br />
... MEL_TITRE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MEL_CORPS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MEL_PRIORITE MEL_ACCUSE <br />
... -------------------------- --------------------------------------- ------------ ---------- <br />
... What is SQL ? &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Is SQL a real relationnal language ? &nbsp; &nbsp;5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 <br />
... Be happy with SQL &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;And d'ont forget to read my books ! &nbsp; &nbsp; NULL &nbsp; &nbsp; &nbsp; &nbsp; NULL <br />
... RV &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OK pour RV jeudi &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 <br />
... Re : What is SQL ? &nbsp; &nbsp; &nbsp; &nbsp; No, because of ... &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0 <br />
... SQL, more explanation &nbsp; &nbsp; &nbsp;You say that SQL.... &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0 <br />
... Voeux &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Salut et bonne année... &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0 <br />
... Lu : What is SQL ? &nbsp; &nbsp; &nbsp; &nbsp; Your mail was read ... &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0 <br />
&nbsp;<br />
SELECT * FROM dbo.T_PIECE_JOINTE_PCJ <br />
&nbsp;<br />
PCJ_ID &nbsp; &nbsp; &nbsp;MEL_GUID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PCJ_NOM_FICHIER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PCJ_TYPE_CONTENU &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PCJ_CONTENU <br />
----------- ------------------------------------ ---------------------------------------------- -------------------------------- ---------------- <br />
2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5478EC6B-B214-47A8-BBB5-8B9519EFD916 Introduction to Relationnal Databases &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pdf &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;xxx <br />
4 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5478EC6B-B214-47A8-BBB5-8B9519EFD916 The Third Manifesto &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pdf &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;xxx <br />
5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5478EC6B-B214-47A8-BBB5-8B9519EFD916 Database in Depth &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ebook &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;xxx <br />
6 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 48D688D9-50FE-48F5-8AE8-D5B063F9BF9B carte de voeux &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; gif &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;xxx <br />
&nbsp;<br />
SELECT * FROM dbo.T_J_MAIL_ENVOYE_ADRESSE_MEA <br />
&nbsp;<br />
ADM_ID &nbsp; &nbsp; &nbsp;MEL_GUID <br />
----------- ------------------------------------ <br />
1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; C3C16F2B-F7A2-497C-A57B-5E807AA8FD8D <br />
1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FEE0DE44-C7AB-43EF-BE13-D319844BF003 <br />
6 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 48D688D9-50FE-48F5-8AE8-D5B063F9BF9B <br />
7 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; EC101A27-B1F6-4454-A171-9D3738D2D930 <br />
7 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 48D688D9-50FE-48F5-8AE8-D5B063F9BF9B <br />
8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 48D688D9-50FE-48F5-8AE8-D5B063F9BF9B</div></div>

</pre>
<p><strong>Voici maintenant les ordre DML d&rsquo;insertion des données du jeu d&rsquo;essais :</strong></p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">INSERT INTO dbo.T_DNS (DNS_ID, DNS_NAME) VALUES (0, 'sqlpro.fr'); <br />
INSERT INTO dbo.T_DNS (DNS_ID, DNS_NAME) VALUES (1, 'ibm.com'); <br />
INSERT INTO dbo.T_DNS (DNS_ID, DNS_NAME) VALUES (2, 'wanadoo.fr'); <br />
INSERT INTO dbo.T_DNS (DNS_ID, DNS_NAME) VALUES (3, 'aol.com'); <br />
INSERT INTO dbo.T_DNS (DNS_ID, DNS_NAME) VALUES (4, 'free.fr'); <br />
INSERT INTO dbo.T_DNS (DNS_ID, DNS_NAME) VALUES (5, 'microsoft.com'); <br />
INSERT INTO dbo.T_DNS (DNS_ID, DNS_NAME) VALUES (6, 'yahoo.fr'); <br />
&nbsp;<br />
INSERT INTO dbo.T_ADRESSE_EMAIL_ADM (ADM_ID, DNS_ID, CML_ID, ADM_COMPTE, ADM_NOM) VALUES (1, 1, NULL, 'chris.date', 'Chris Date (IBM)'); <br />
INSERT INTO dbo.T_ADRESSE_EMAIL_ADM (ADM_ID, DNS_ID, CML_ID, ADM_COMPTE, ADM_NOM) VALUES (2, 1, NULL, 'edgar.codd', 'Edgar Codd (IBM)'); <br />
INSERT INTO dbo.T_ADRESSE_EMAIL_ADM (ADM_ID, DNS_ID, CML_ID, ADM_COMPTE, ADM_NOM) VALUES (3, 0, NULL, 'r.dupond', 'moi'); <br />
INSERT INTO dbo.T_ADRESSE_EMAIL_ADM (ADM_ID, DNS_ID, CML_ID, ADM_COMPTE, ADM_NOM) VALUES (4, 0, NULL, 'remy.dupond', 'remoi'); <br />
INSERT INTO dbo.T_ADRESSE_EMAIL_ADM (ADM_ID, DNS_ID, CML_ID, ADM_COMPTE, ADM_NOM) VALUES (5, 0, NULL, 'rdp', 'encore moi'); <br />
INSERT INTO dbo.T_ADRESSE_EMAIL_ADM (ADM_ID, DNS_ID, CML_ID, ADM_COMPTE, ADM_NOM) VALUES (6, 2, NULL, 'thierry.narguy', 'Thierry N (copain d''avant)'); <br />
INSERT INTO dbo.T_ADRESSE_EMAIL_ADM (ADM_ID, DNS_ID, CML_ID, ADM_COMPTE, ADM_NOM) VALUES (7, 2, NULL, 'michele.lamarque', 'Michèle, ma belle'); <br />
INSERT INTO dbo.T_ADRESSE_EMAIL_ADM (ADM_ID, DNS_ID, CML_ID, ADM_COMPTE, ADM_NOM) VALUES (8, 3, NULL, 'james.kelly', 'JKL à New York'); <br />
INSERT INTO dbo.T_ADRESSE_EMAIL_ADM (ADM_ID, DNS_ID, CML_ID, ADM_COMPTE, ADM_NOM) VALUES (9, 5, NULL, 'bill.gates', 'bilou mon pote'); <br />
&nbsp;<br />
INSERT INTO dbo.T_COMPTE_EMAIL_CML (CML_ID, ADM_ID, CML_USER_NAME, CML_PASSWORD, CML_SERVER) VALUES (1, 3, 'rdp', &nbsp;'012FC685DA1420584C45FED12581C526', 'pop.sqlpro.fr'); <br />
INSERT INTO dbo.T_COMPTE_EMAIL_CML (CML_ID, ADM_ID, CML_USER_NAME, CML_PASSWORD, CML_SERVER) VALUES (2, 4, 'rdp2', '45FED1258012FC680584C1C5265DA142', 'pop.sqlpro.fr'); <br />
INSERT INTO dbo.T_COMPTE_EMAIL_CML (CML_ID, ADM_ID, CML_USER_NAME, CML_PASSWORD, CML_SERVER) VALUES (3, 5, 'rd', &nbsp; 'C1C545FE12FC6D1258080142584265DA', 'pop.sqlpro.fr'); <br />
&nbsp;<br />
UPDATE dbo.T_ADRESSE_EMAIL_ADM SET CML_ID = 1 WHERE ADM_ID = 3; <br />
UPDATE dbo.T_ADRESSE_EMAIL_ADM SET CML_ID = 2 WHERE ADM_ID = 4; <br />
UPDATE dbo.T_ADRESSE_EMAIL_ADM SET CML_ID = 3 WHERE ADM_ID = 5; <br />
&nbsp;<br />
INSERT INTO dbo.T_EMAIL_EML (MEL_GUID, MEL_GUID_ORIGINE, ADM_ID, CML_ID_RECUT, CML_ID_ENVOI, MEL_DATEHEURE, MEL_TITRE, MEL_CORPS, MEL_PRIORITE, MEL_ACCUSE) <br />
&nbsp;VALUES ('C3C16F2B-F7A2-497C-A57B-5E807AA8FD8D', NULL, NULL, NULL, 2, 2008-07-25 10:44:27.000, 'What is SQL ?', 'Is SQL a real relationnal language ?', 5, 1); <br />
INSERT INTO dbo.T_EMAIL_EML (MEL_GUID, MEL_GUID_ORIGINE, ADM_ID, CML_ID_RECUT, CML_ID_ENVOI, MEL_DATEHEURE, MEL_TITRE, MEL_CORPS, MEL_PRIORITE, MEL_ACCUSE) <br />
&nbsp;VALUES ('5478EC6B-B214-47A8-BBB5-8B9519EFD916', NULL, 1, 3, NULL, 2008-12-30 22:44:16.000, 'Be happy with SQL', 'And d''ont forget to read my books !', NULL, NULL); <br />
INSERT INTO dbo.T_EMAIL_EML (MEL_GUID, MEL_GUID_ORIGINE, ADM_ID, CML_ID_RECUT, CML_ID_ENVOI, MEL_DATEHEURE, MEL_TITRE, MEL_CORPS, MEL_PRIORITE, MEL_ACCUSE) <br />
&nbsp;VALUES ('EC101A27-B1F6-4454-A171-9D3738D2D930', NULL, NULL, NULL, 1, 2009-01-01 12:31:28.000, 'RV', 'OK pour RV jeudi', 3, 1); <br />
INSERT INTO dbo.T_EMAIL_EML (MEL_GUID, MEL_GUID_ORIGINE, ADM_ID, CML_ID_RECUT, CML_ID_ENVOI, MEL_DATEHEURE, MEL_TITRE, MEL_CORPS, MEL_PRIORITE, MEL_ACCUSE) <br />
&nbsp;VALUES ('BEE3F817-637D-40C7-801B-AA4A2E5CBDEB', 'C3C16F2B-F7A2-497C-A57B-5E807AA8FD8D', 2, 2, NULL, 2008-07-25 17:28:33.000, 'Re : What is SQL ?', 'No, because of ...', 5, 0); <br />
INSERT INTO dbo.T_EMAIL_EML (MEL_GUID, MEL_GUID_ORIGINE, ADM_ID, CML_ID_RECUT, CML_ID_ENVOI, MEL_DATEHEURE, MEL_TITRE, MEL_CORPS, MEL_PRIORITE, MEL_ACCUSE) <br />
&nbsp;VALUES ('FEE0DE44-C7AB-43EF-BE13-D319844BF003', 'BEE3F817-637D-40C7-801B-AA4A2E5CBDEB', NULL, NULL, 2, 2008-07-28 10:19:11.000, 'SQL, more explanation', 'You say that SQL....', 5, 0); <br />
INSERT INTO dbo.T_EMAIL_EML (MEL_GUID, MEL_GUID_ORIGINE, ADM_ID, CML_ID_RECUT, CML_ID_ENVOI, MEL_DATEHEURE, MEL_TITRE, MEL_CORPS, MEL_PRIORITE, MEL_ACCUSE) <br />
&nbsp;VALUES ('48D688D9-50FE-48F5-8AE8-D5B063F9BF9B', NULL, NULL, NULL, 3, 2009-01-01 12:31:28.000, 'Voeux', 'Salut et bonne année...', 1, 0); <br />
INSERT INTO dbo.T_EMAIL_EML (MEL_GUID, MEL_GUID_ORIGINE, ADM_ID, CML_ID_RECUT, CML_ID_ENVOI, MEL_DATEHEURE, MEL_TITRE, MEL_CORPS, MEL_PRIORITE, MEL_ACCUSE) <br />
&nbsp;VALUES ('24452E97-5DB8-41FB-9A32-D6131F93B38A', 'C3C16F2B-F7A2-497C-A57B-5E807AA8FD8D', 2, 2, NULL, 2008-07-25 17:12:44.000, 'Lu : What is SQL ?', 'Your mail was read ...', 5, 0); <br />
&nbsp;<br />
INSERT INTO dbo.T_PIECE_JOINTE_PCJ (PCJ_ID, MEL_GUID, PCJ_NOM_FICHIER, PCJ_TYPE_CONTENU, PCJ_CONTENU) <br />
&nbsp;VALUES (2, '5478EC6B-B214-47A8-BBB5-8B9519EFD916', 'Introduction to Relationnal Databases', 'pdf', 'xxx'); <br />
INSERT INTO dbo.T_PIECE_JOINTE_PCJ (PCJ_ID, MEL_GUID, PCJ_NOM_FICHIER, PCJ_TYPE_CONTENU, PCJ_CONTENU) <br />
&nbsp;VALUES (4, '5478EC6B-B214-47A8-BBB5-8B9519EFD916', 'The Third Manifesto', 'pdf', 'xxx'); <br />
INSERT INTO dbo.T_PIECE_JOINTE_PCJ (PCJ_ID, MEL_GUID, PCJ_NOM_FICHIER, PCJ_TYPE_CONTENU, PCJ_CONTENU) <br />
&nbsp;VALUES (5, '5478EC6B-B214-47A8-BBB5-8B9519EFD916', 'Database in Depth', 'ebook', 'xxx'); <br />
INSERT INTO dbo.T_PIECE_JOINTE_PCJ (PCJ_ID, MEL_GUID, PCJ_NOM_FICHIER, PCJ_TYPE_CONTENU, PCJ_CONTENU) <br />
&nbsp;VALUES (6, '48D688D9-50FE-48F5-8AE8-D5B063F9BF9B', 'carte de voeux', 'gif', 'xxx'); <br />
&nbsp;<br />
INSERT INTO dbo.T_J_MAIL_ENVOYE_ADRESSE_MEA (ADM_ID, MEL_GUID) VALUES (1, 'C3C16F2B-F7A2-497C-A57B-5E807AA8FD8D'); <br />
INSERT INTO dbo.T_J_MAIL_ENVOYE_ADRESSE_MEA (ADM_ID, MEL_GUID) VALUES (1, 'FEE0DE44-C7AB-43EF-BE13-D319844BF003'); <br />
INSERT INTO dbo.T_J_MAIL_ENVOYE_ADRESSE_MEA (ADM_ID, MEL_GUID) VALUES (6, '48D688D9-50FE-48F5-8AE8-D5B063F9BF9B'); <br />
INSERT INTO dbo.T_J_MAIL_ENVOYE_ADRESSE_MEA (ADM_ID, MEL_GUID) VALUES (7, 'EC101A27-B1F6-4454-A171-9D3738D2D930'); <br />
INSERT INTO dbo.T_J_MAIL_ENVOYE_ADRESSE_MEA (ADM_ID, MEL_GUID) VALUES (7, '48D688D9-50FE-48F5-8AE8-D5B063F9BF9B'); <br />
INSERT INTO dbo.T_J_MAIL_ENVOYE_ADRESSE_MEA(ADM_ID, MEL_GUID) VALUES (8, '48D688D9-50FE-48F5-8AE8-D5B063F9BF9B');</div></div>

</pre>
<p><em><strong>A vous de jouer !</strong></em></p>
<p>&#8212;<br />
Frédéric BROUARD, Spécialiste modélisation, bases de données, optimisation, langage SQL.<br />
Le site sur le langage SQL et les S.G.B.D. relationnels : http://sqlpro.developpez.com/<br />
Expert SQL Server http://www.sqlspot.com : audit, optimisation, tuning, formation<br />
* * * * * Enseignant au CNAM PACA et à l&rsquo;ISEN à Toulon * * * * * </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Colle SQL n°2</title>
		<link>https://blog.developpez.com/exercices-sql/p8275/exercices-sql/colle_sql_nd2_1</link>
		<comments>https://blog.developpez.com/exercices-sql/p8275/exercices-sql/colle_sql_nd2_1#comments</comments>
		<pubDate>Tue, 03 Nov 2009 21:20:10 +0000</pubDate>
		<dc:creator><![CDATA[SQLpro]]></dc:creator>
				<category><![CDATA[Exercices SQL]]></category>
		<category><![CDATA[SQL pur]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Comment numéroter avec rupture, sans utiliser les fonctions de fenêtrage comme ROW_NUMBER() ? Voici une table et son contenu : CREATE TABLE T (Numero_Compte &#160;INT, Groupe CHAR(1), Montant DECIMAL(16,4)); &#160; INSERT INTO T VALUES (23441, 'A', 755.95655999999997) INSERT INTO T VALUES (28972, 'A', 1293.1123) INSERT INTO T VALUES (28973, 'A', 388.51556899999997) INSERT INTO T VALUES (32091, 'A', 2875.866) INSERT INTO T VALUES (34193, 'A', 4661.9679999999998) INSERT INTO T VALUES (37237, 'S', 312.12299999999999) INSERT INTO T [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Comment numéroter avec rupture, sans utiliser les fonctions de fenêtrage comme ROW_NUMBER() ?</p>
<p><span id="more-4"></span></p>
<p>Voici une table et son contenu :</p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">CREATE TABLE T (Numero_Compte &nbsp;INT, Groupe CHAR(1), Montant DECIMAL(16,4)); <br />
&nbsp;<br />
INSERT INTO T VALUES (23441, 'A', 755.95655999999997) <br />
INSERT INTO T VALUES (28972, 'A', 1293.1123) <br />
INSERT INTO T VALUES (28973, 'A', 388.51556899999997) <br />
INSERT INTO T VALUES (32091, 'A', 2875.866) <br />
INSERT INTO T VALUES (34193, 'A', 4661.9679999999998) <br />
INSERT INTO T VALUES (37237, 'S', 312.12299999999999) <br />
INSERT INTO T VALUES (39156, 'S', 309.65827000000002) <br />
INSERT INTO T VALUES (45230, 'S', 615.71899999999994) <br />
INSERT INTO T VALUES (45841, 'S', 365.96730000000002) <br />
INSERT INTO T VALUES (46531, 'S', 576.68309999999997) <br />
INSERT INTO T VALUES (47181, 'S', 1450.2131999999999)</div></div>

</pre>
<p>Comment faire en sorte d&rsquo;obtenir une numérotation dans l&rsquo;ordre des colonnes Numero_Compte et Montant avec une rupture sur Groupe ?<br />
Et ainsi obtenir le résultat suivants :</p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Numero_Compte Groupe Montant &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;N <br />
------------- ------ ---------------- ------ <br />
34193 &nbsp; &nbsp; &nbsp; &nbsp; A &nbsp; &nbsp; &nbsp;4661.9680 &nbsp; &nbsp; &nbsp; &nbsp;1 <br />
32091 &nbsp; &nbsp; &nbsp; &nbsp; A &nbsp; &nbsp; &nbsp;2875.8660 &nbsp; &nbsp; &nbsp; &nbsp;2 <br />
28973 &nbsp; &nbsp; &nbsp; &nbsp; A &nbsp; &nbsp; &nbsp;388.5156 &nbsp; &nbsp; &nbsp; &nbsp; 3 <br />
28972 &nbsp; &nbsp; &nbsp; &nbsp; A &nbsp; &nbsp; &nbsp;1293.1123 &nbsp; &nbsp; &nbsp; &nbsp;4 <br />
23441 &nbsp; &nbsp; &nbsp; &nbsp; A &nbsp; &nbsp; &nbsp;755.9566 &nbsp; &nbsp; &nbsp; &nbsp; 5 <br />
47181 &nbsp; &nbsp; &nbsp; &nbsp; S &nbsp; &nbsp; &nbsp;1450.2132 &nbsp; &nbsp; &nbsp; &nbsp;1 <br />
46531 &nbsp; &nbsp; &nbsp; &nbsp; S &nbsp; &nbsp; &nbsp;576.6831 &nbsp; &nbsp; &nbsp; &nbsp; 2 <br />
45841 &nbsp; &nbsp; &nbsp; &nbsp; S &nbsp; &nbsp; &nbsp;365.9673 &nbsp; &nbsp; &nbsp; &nbsp; 3 <br />
45230 &nbsp; &nbsp; &nbsp; &nbsp; S &nbsp; &nbsp; &nbsp;615.7190 &nbsp; &nbsp; &nbsp; &nbsp; 4 <br />
39156 &nbsp; &nbsp; &nbsp; &nbsp; S &nbsp; &nbsp; &nbsp;309.6583 &nbsp; &nbsp; &nbsp; &nbsp; 5 <br />
37237 &nbsp; &nbsp; &nbsp; &nbsp; S &nbsp; &nbsp; &nbsp;312.1230 &nbsp; &nbsp; &nbsp; &nbsp; 6</div></div>

</pre>
<p>???</p>
<p>&#8212;<br />
Frédéric BROUARD, Spécialiste modélisation, bases de données, optimisation, langage SQL.<br />
Le site sur le langage SQL et les S.G.B.D. relationnels : http://sqlpro.developpez.com/<br />
Expert SQL Server http://www.sqlspot.com : audit, optimisation, tuning, formation<br />
* * * * * Enseignant au CNAM PACA et à l&rsquo;ISEN à Toulon * * * * * </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Colle SQL n°1</title>
		<link>https://blog.developpez.com/exercices-sql/p8273/exercices-sql/colle_sql_nd1</link>
		<comments>https://blog.developpez.com/exercices-sql/p8273/exercices-sql/colle_sql_nd1#comments</comments>
		<pubDate>Tue, 03 Nov 2009 21:06:54 +0000</pubDate>
		<dc:creator><![CDATA[SQLpro]]></dc:creator>
				<category><![CDATA[Exercices SQL]]></category>
		<category><![CDATA[SQL pur]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Voici un exercice basé sur une requête&#8230; Avec les éléments suivants : CREATE TABLE JeanMarc68 &#160; (nolot int, prenom varchar(8), nom varchar(8)); &#160; INSERT INTO JeanMarc68 VALUES (4000, 'Albert', 'Einstein'); INSERT INTO JeanMarc68 VALUES (4000, 'Mileva', 'Einstein'); INSERT INTO JeanMarc68 VALUES (4001, 'Marie', &#160;'Curie'); INSERT INTO JeanMarc68 VALUES (4001, 'Pierre', 'Curie'); INSERT INTO JeanMarc68 VALUES (4002, 'Albert', 'Einstein'); INSERT INTO JeanMarc68 VALUES (4003, 'Barack', 'Obama'); INSERT INTO JeanMarc68 VALUES (4004, 'Albert', 'Einstein'); INSERT INTO JeanMarc68 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Voici un exercice basé sur une requête&#8230;<br />
<span id="more-3"></span></p>
<p>Avec les éléments suivants :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">CREATE TABLE JeanMarc68 &nbsp;<br />
(nolot int, prenom varchar(8), nom varchar(8)); <br />
&nbsp;<br />
INSERT INTO JeanMarc68 VALUES (4000, 'Albert', 'Einstein'); <br />
INSERT INTO JeanMarc68 VALUES (4000, 'Mileva', 'Einstein'); <br />
INSERT INTO JeanMarc68 VALUES (4001, 'Marie', &nbsp;'Curie'); <br />
INSERT INTO JeanMarc68 VALUES (4001, 'Pierre', 'Curie'); <br />
INSERT INTO JeanMarc68 VALUES (4002, 'Albert', 'Einstein'); <br />
INSERT INTO JeanMarc68 VALUES (4003, 'Barack', 'Obama'); <br />
INSERT INTO JeanMarc68 VALUES (4004, 'Albert', 'Einstein'); <br />
INSERT INTO JeanMarc68 VALUES (4004, 'Mileva', 'Einstein ');</div></div>
<p><strong>Le problème : </strong></p>
<p>Soit la table &laquo;&nbsp;JeanMarc68&Prime; contenant une colonne nolot, une colonne nom et un colonne prenom.<br />
J&rsquo;ai besoin, en entrant un nolot en paramètre de la requête, par exemple 4000, de retrouver<br />
tous les lots ayant toutes les mêmes valeurs pour nom et prénom.</p>
<p>Avec la valeur 4000, le lot 4004 doit sortir parce qu&rsquo;il contient Albert Einstein ET Mileva Einstein,<br />
tout comme 4000 qui est en argument de la requête.<br />
4002 ne devra pas sortir parce qu&rsquo;il ne contient pas Mileva Einstein.</p>
<p><strong>Voici une requête SQL répondant à cette question :</strong></p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">WITH T AS <br />
(SELECT nom, prenom <br />
&nbsp;FROM &nbsp; JeanMarc68 <br />
&nbsp;INTERSECT <br />
&nbsp;SELECT nom, prenom <br />
&nbsp;FROM &nbsp; JeanMarc68 <br />
&nbsp;WHERE &nbsp;nolot = 4000) <br />
SELECT nolot <br />
FROM &nbsp; JeanMarc68 AS JM <br />
&nbsp; &nbsp; &nbsp; &nbsp;INNER JOIN T <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ON JM.nom = T.nom <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AND JM.prenom = T.prenom <br />
GROUP BY nolot &nbsp;<br />
HAVING COUNT(*) = (SELECT COUNT(*) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FROM &nbsp; T);</div></div>

</pre>
<p><strong><br />
1) Pouvez vous expliquer son fonctionnement ?</p>
<p>2) que faut-il modifier&#8230;</strong><br />
&#8230;pour que d&rsquo;éventuels doublons, comme le rajout de la ligne suivante :                   </p>
<p><code class="codecolorer text default"><span class="text">INSERT INTO JeanMarc68 VALUES (4000, 'Albert', 'Einstein');</span></code>  </p>
<p>donne toujours la bonne réponse ?</p>
<p>&#8212;<br />
Frédéric BROUARD, Spécialiste modélisation, bases de données, optimisation, langage SQL.<br />
Le site sur le langage SQL et les S.G.B.D. relationnels : http://sqlpro.developpez.com/<br />
Expert SQL Server http://www.sqlspot.com : audit, optimisation, tuning, formation<br />
* * * * * Enseignant au CNAM PACA et à l&rsquo;ISEN à Toulon * * * * * </p>
<p>HAVING COUNT(DISTINCT JM.nom + &lsquo;#&rsquo; + JM.prenom) = (SELECT COUNT(*)<br />
                                                   FROM   T)</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Contrainte de validation pour date incomplète</title>
		<link>https://blog.developpez.com/exercices-sql/p7816/exercices-sql/contrainte_de_validation_pour_date_incom</link>
		<comments>https://blog.developpez.com/exercices-sql/p7816/exercices-sql/contrainte_de_validation_pour_date_incom#comments</comments>
		<pubDate>Wed, 01 Jul 2009 11:29:51 +0000</pubDate>
		<dc:creator><![CDATA[SQLpro]]></dc:creator>
				<category><![CDATA[Exercices SQL]]></category>
		<category><![CDATA[Modèle de données]]></category>
		<category><![CDATA[SQL pur]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Voici un petit exercice récalcitrant : vérifier qu&#8217;une date est valide, lorsqu&#8217;elle est incomplète&#8230; Soit la table suivante : CREATE TABLE T_PERSONNE_PRS (PRS_ID &#160; &#160; &#160; &#160; &#160; &#160; &#160;INT NOT NULL PRIMARY KEY, &#160;PRS_NOM &#160; &#160; &#160; &#160; &#160; &#160; CHAR(32) NOT NULL, &#160;PRS_NAISSANCE_AN &#160; &#160;SMALLINT, &#160;PRS_NAISSANCE_MOIS &#160;SMALLINT, &#160; &#160;PRS_NAISSANCE_JOUR &#160;SMALLINT) Comment faire en sorte à l&#8217;aide de contraintes CHECK (validation) que la date de naissance, même rentrée partiellement, soit valide ? Voici le [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Voici un petit exercice récalcitrant : vérifier qu&rsquo;une date est valide, lorsqu&rsquo;elle est incomplète&#8230;<br />
<span id="more-6"></span><br />
Soit la table suivante :</p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">CREATE TABLE T_PERSONNE_PRS <br />
(PRS_ID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;INT NOT NULL PRIMARY KEY, <br />
&nbsp;PRS_NOM &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CHAR(32) NOT NULL, <br />
&nbsp;PRS_NAISSANCE_AN &nbsp; &nbsp;SMALLINT, <br />
&nbsp;PRS_NAISSANCE_MOIS &nbsp;SMALLINT, &nbsp;<br />
&nbsp;PRS_NAISSANCE_JOUR &nbsp;SMALLINT)</div></div>

</pre>
<p>Comment faire en sorte à l&rsquo;aide de contraintes CHECK (validation) que la date de naissance, même rentrée partiellement, soit valide ?</p>
<p>Voici le jeu de tests pour validation :</p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">INSERT INTO T_PERSONNE_PRS (PRS_ID, PRS_NOM, PRS_NAISSANCE_AN, PRS_NAISSANCE_MOIS, PRS_NAISSANCE_JOUR) <br />
VALUES (1, 'Dupont', 1960, 4, 1); <br />
INSERT INTO T_PERSONNE_PRS (PRS_ID, PRS_NOM, PRS_NAISSANCE_AN, PRS_NAISSANCE_MOIS, PRS_NAISSANCE_JOUR) <br />
VALUES (2, 'Duval', 1960, 2, 29); &nbsp;<br />
INSERT INTO T_PERSONNE_PRS (PRS_ID, PRS_NOM, PRS_NAISSANCE_AN, PRS_NAISSANCE_MOIS, PRS_NAISSANCE_JOUR) <br />
VALUES (3, 'Martin', 1900, 2, 29); &nbsp;<br />
INSERT INTO T_PERSONNE_PRS (PRS_ID, PRS_NOM, PRS_NAISSANCE_AN, PRS_NAISSANCE_MOIS, PRS_NAISSANCE_JOUR) <br />
VALUES (4, 'Dufour', 1900, NULL, NULL); &nbsp;<br />
INSERT INTO T_PERSONNE_PRS (PRS_ID, PRS_NOM, PRS_NAISSANCE_AN, PRS_NAISSANCE_MOIS, PRS_NAISSANCE_JOUR) <br />
VALUES (5, 'Dufaut', 1900, 12, NULL); &nbsp;<br />
INSERT INTO T_PERSONNE_PRS (PRS_ID, PRS_NOM, PRS_NAISSANCE_AN, PRS_NAISSANCE_MOIS, PRS_NAISSANCE_JOUR) <br />
VALUES (6, 'Dulong', NULL, 12, NULL); &nbsp;<br />
INSERT INTO T_PERSONNE_PRS (PRS_ID, PRS_NOM, PRS_NAISSANCE_AN, PRS_NAISSANCE_MOIS, PRS_NAISSANCE_JOUR) <br />
VALUES (7, 'Ducong', NULL, 12, 31); <br />
INSERT INTO T_PERSONNE_PRS (PRS_ID, PRS_NOM, PRS_NAISSANCE_AN, PRS_NAISSANCE_MOIS, PRS_NAISSANCE_JOUR) <br />
VALUES (8, 'Dubourg', NULL, 2, 29); <br />
INSERT INTO T_PERSONNE_PRS (PRS_ID, PRS_NOM, PRS_NAISSANCE_AN, PRS_NAISSANCE_MOIS, PRS_NAISSANCE_JOUR) <br />
VALUES (9, 'Muller', NULL, 2, 30); <br />
INSERT INTO T_PERSONNE_PRS (PRS_ID, PRS_NOM, PRS_NAISSANCE_AN, PRS_NAISSANCE_MOIS, PRS_NAISSANCE_JOUR) <br />
VALUES (10, 'Meunier', NULL, 13, NULL); <br />
INSERT INTO T_PERSONNE_PRS (PRS_ID, PRS_NOM, PRS_NAISSANCE_AN, PRS_NAISSANCE_MOIS, PRS_NAISSANCE_JOUR) <br />
VALUES (11, 'Mallet', NULL, NULL, 32); <br />
INSERT INTO T_PERSONNE_PRS (PRS_ID, PRS_NOM, PRS_NAISSANCE_AN, PRS_NAISSANCE_MOIS, PRS_NAISSANCE_JOUR) <br />
VALUES (12, 'Meurice', NULL, 13, 32); <br />
INSERT INTO T_PERSONNE_PRS (PRS_ID, PRS_NOM, PRS_NAISSANCE_AN, PRS_NAISSANCE_MOIS, PRS_NAISSANCE_JOUR) <br />
VALUES (13, 'Mallet', 1975, NULL, 32); <br />
INSERT INTO T_PERSONNE_PRS (PRS_ID, PRS_NOM, PRS_NAISSANCE_AN, PRS_NAISSANCE_MOIS, PRS_NAISSANCE_JOUR) <br />
VALUES (14, 'Maurier', 1975, 13, NULL) <br />
INSERT INTO T_PERSONNE_PRS (PRS_ID, PRS_NOM, PRS_NAISSANCE_AN, PRS_NAISSANCE_MOIS, PRS_NAISSANCE_JOUR) <br />
VALUES (15, 'Dubuis', 1975, NULL, 31); <br />
INSERT INTO T_PERSONNE_PRS (PRS_ID, PRS_NOM, PRS_NAISSANCE_AN, PRS_NAISSANCE_MOIS, PRS_NAISSANCE_JOUR) <br />
VALUES (16, 'Dupuis', NULL, NULL, 31);</div></div>

</pre>
<p>A la fin de ce lot d&rsquo;insertion, vous ne devriez avoir dans votre table que les lignes dont les noms des personnes commencent par D, soit 9 lignes :</p>
<pre>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">PRS_ID &nbsp; &nbsp; &nbsp;PRS_NOM &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PRS_NAISSANCE_AN PRS_NAISSANCE_MOIS PRS_NAISSANCE_JOUR <br />
----------- -------------------------------- ---------------- ------------------ ------------------ <br />
1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Dupont &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1960 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 4 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 <br />
2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Duval &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1960 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;29 <br />
4 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Dufour &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1900 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL <br />
5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Dufaut &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1900 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 12 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL <br />
6 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Dulong &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 12 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL <br />
7 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Dulong &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 12 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 31 <br />
8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Dubourg &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NULL &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;29 <br />
15 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Dubuis &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1975 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 31 <br />
16 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Dupuis &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NULL &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 31</div></div>

</pre>
<p>A vous de jouer pour trouver la manière la plus concise d&rsquo;écrire cette contrainte !</p>
<p>&#8212;<br />
Frédéric BROUARD, Spécialiste modélisation, bases de données, optimisation, langage SQL.<br />
Le site sur le langage SQL et les S.G.B.D. relationnels : http://sqlpro.developpez.com/<br />
Expert SQL Server http://www.sqlspot.com : audit, optimisation, tuning, formation<br />
* * * * * Enseignant au CNAM PACA et à l&rsquo;ISEN à Toulon * * * * *  </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Modélisation des données de la CIM10</title>
		<link>https://blog.developpez.com/exercices-sql/p7575/exercices-sql/modelisation_des_donnees_de_la_cim10</link>
		<comments>https://blog.developpez.com/exercices-sql/p7575/exercices-sql/modelisation_des_donnees_de_la_cim10#comments</comments>
		<pubDate>Thu, 07 May 2009 10:54:44 +0000</pubDate>
		<dc:creator><![CDATA[SQLpro]]></dc:creator>
				<category><![CDATA[Exercices SQL]]></category>
		<category><![CDATA[Modèle de données]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Cet exercice est basé sur la modélisation de la CIM10 (Classification Internationale des Maladies de l&#8217;OMS) et comporte deux parties : réalisation des MCD et MPD et implantation de contraintes SQL complexes. L&#8217;OMS (Organisation Mondiale de la Santé) édite un document appelé CIM (CIM10 ou CIM11 version la plus récent) pour Classification Internationale des Maladies. Ce document, qui recense toute les maladies, est organisé par chapitre, sous chapitre et maladies avec différents niveau d&#8217;imbrication. Pour [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Cet exercice est basé sur la modélisation de la CIM10 (Classification Internationale des Maladies de l&rsquo;OMS) et comporte deux parties : réalisation des MCD et MPD et implantation de contraintes SQL complexes.<br />
<span id="more-2"></span></p>
<p>L&rsquo;OMS (Organisation Mondiale de la Santé) édite un document appelé CIM (CIM10 ou CIM11 version la plus récent) pour Classification Internationale des Maladies.<br />
Ce document, qui recense toute les maladies, est organisé par chapitre, sous chapitre et maladies avec différents niveau d&rsquo;imbrication.<br />
Pour en connaître la structure détaillé, vous pouvez consulter le site web de l&rsquo;OMS : <a href="http://apps.who.int/classifications/apps/icd/icd10online/">http://apps.who.int/classifications/apps/icd/icd10online/</a></p>
<p>Chaque maladie est identifiée par un code comportant deux parties :<br />
la première partie est de 3 caractères : une lettre suivi de deux chiffres (donc de A00 à Z99)<br />
la seconde partie est un nombre généralement de 0 à 9, mais pouvant être étendu à deux ou trois chiffres selon des besoins spécifiques</p>
<p>Voici quelques exemples de maladies :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">E67.0 &nbsp; &nbsp; Hypervitaminosis A <br />
E67.1 &nbsp; &nbsp; Hypercarotenaemia <br />
E67.2 &nbsp; &nbsp; Megavitamin-B 6 syndrome <br />
E67.3 &nbsp; &nbsp; Hypervitaminosis D <br />
E67.8 &nbsp; &nbsp; Other specified hyperalimentation</div></div>
<p>Comme vous pouvez le constater, la numérotation n&rsquo;est pas continue. Par exemple il n&rsquo;y a pas de maladie E67.4</p>
<p>Voici un exemple des imbrications des différents chapitres :</p>
<p>D&rsquo;abord les chapitres :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">I &nbsp; A00-B99 &nbsp; Certaines maladies infectieuses et parasitaires <br />
II &nbsp; C00-D48 &nbsp; Tumeurs <br />
III &nbsp; D50-D89 &nbsp; Maladies du sang et des organes hématopoïétiques et certains troubles du système immunitaire <br />
IV &nbsp; E00-E90 &nbsp; Maladies endocriniennes, nutritionnelles et métaboliques</div></div>
<p>Comme vous pouvez le constater il y a des &laquo;&nbsp;trous&nbsp;&raquo; entres les chapitres. Par exemple les entrées D49, D90 à D99 ne sont rattachées à aucun chapitre.</p>
<p>Ensuite l&rsquo;arborescence des sous chapitres :<br />
Exemple, avec une partie du chapitre II :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">C00-D48 Neoplasms <br />
&nbsp; C00-C97 Malignant neoplasms <br />
&nbsp; &nbsp; C00-C75 Malignant neoplasms, stated or presumed to be primary, of specified sites, except of lymphoid, haematopoietic and related tissue <br />
&nbsp; &nbsp; &nbsp; C00-C14 Lip, oral cavity and pharynx <br />
&nbsp; &nbsp; &nbsp; C15-C26 Digestive organs <br />
&nbsp; &nbsp; &nbsp; C30-C39 Respiratory and intrathoracic organs <br />
&nbsp; &nbsp; &nbsp; C40-C41 Bone and articular cartilage <br />
&nbsp; &nbsp; &nbsp; C43-C44 Skin <br />
&nbsp; &nbsp; &nbsp; C45-C49 &nbsp;Mesothelial and soft tissue <br />
&nbsp; &nbsp; &nbsp; C50 &nbsp; &nbsp; Breast <br />
&nbsp; &nbsp; &nbsp; C51-C58 Female genital organs <br />
&nbsp; &nbsp; &nbsp; C60-C63 Male genital organs <br />
&nbsp; &nbsp; &nbsp; C64-C68 Urinary tract <br />
&nbsp; &nbsp; &nbsp; C69-C72 Eye, brain and other parts of central nervous system <br />
&nbsp; &nbsp; &nbsp; C73-C75 Thyroid and other endocrine glands <br />
&nbsp; &nbsp; C76-C80 Malignant neoplasms of ill-defined, secondary and unspecified sites <br />
&nbsp; &nbsp; C81-C96 Malignant neoplasms, stated or presumed to be primary, of lymphoid, haematopoietic and related tissue <br />
&nbsp; &nbsp; C97 Malignant neoplasms of independent (primary) multiple sites <br />
&nbsp; D00-D09 In situ neoplasms <br />
&nbsp; D10-D36 Benign neoplasms <br />
&nbsp; D37-D48 Neoplasms of uncertain or unknown behaviour</div></div>
<p>Ici 4 niveaux d&rsquo;imbrication sont à remarquer.</p>
<p><strong>EXERCICES</strong> </p>
<p><strong>I &#8211; Modélisation de données :</strong></p>
<p>Réalisez le modèle conceptuel de données permettant la saisie des données de la CIM10, sachant que les libellés de chapitres et de maladie ont deux versions, celle en anglais et celle en français</p>
<p><strong>II &#8211; dans ce modèle de données, assurez vous des règles suivantes à l&rsquo;aide de contraintes ou de déclencheurs :</strong></p>
<p><strong>1</strong> &#8211; La saisie d&rsquo;un code maladie doit impérativement commencer par une lettre en majuscule suivie de deux chiffres. Des saisie commes &lsquo;a01&prime;, aa1&prime;, &lsquo;111&rsquo;, &lsquo;a 1&prime; doivent être rejetées.<br />
<strong>2</strong> &#8211; Pour les maladies comme pour les chapitres et sous chapitre au moins un des deux libellés doit être rempli<br />
<strong>3</strong> &#8211; Pour les chapitres et sous chapitres, le code début doit être inférieur ou égal au code fin<br />
<strong>4</strong> &#8211; Pour les chapitres de même niveau, aucun chevauchement de code ne doit se produire<br />
<strong>5</strong> &#8211; Tout chapitre de niveau n doit être inclus dans un chapitre de niveau n-1</p>
<p>&#8212;<br />
Frédéric BROUARD, Spécialiste modélisation, bases de données, optimisation, langage SQL.<br />
Le site sur le langage SQL et les S.G.B.D. relationnels : http://sqlpro.developpez.com/<br />
Expert SQL Server http://www.sqlspot.com : audit, optimisation, tuning, formation<br />
* * * * * Enseignant au CNAM PACA et à l&rsquo;ISEN à Toulon * * * * * </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
