<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Blogs - Blog de Lyche par Lyche</title>
		<link>https://www.developpez.net/forums/blogs/135170-lyche/</link>
		<description>Developpez.com, le Club des Développeurs et IT Pro</description>
		<language>fr</language>
		<lastBuildDate>Wed, 08 Apr 2026 18:28:19 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.jpg</url>
			<title>Forum du club des développeurs et IT Pro - Blogs - Blog de Lyche par Lyche</title>
			<link>https://www.developpez.net/forums/blogs/135170-lyche/</link>
		</image>
		<item>
			<title>Les jointures en SQL</title>
			<link>https://www.developpez.net/forums/blogs/135170-lyche/b1660/jointures-sql/</link>
			<pubDate>Tue, 27 Sep 2016 21:10:16 GMT</pubDate>
			<description>*Présentation* 
 
Une base de...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><b><font color="#0000FF">Présentation</font></b><br />
<br />
Une base de données relationnelle, c’est la mise en place d’une organisation claire et efficace des données d’une entreprise basée sur la théorie des ensembles.<br />
Chaque élément constitutif d’un modèle possède un ou plusieurs liens avec un ou plusieurs autres objets. Ce lien est traduit en modélisation par l’exportation d’un élément « la clé » d’une table vers une autre table à laquelle elle est liée. Ceci est vu par la modélisation UML/MERISE. Nous allons parler ici de l’application technique de ces liens par le SQL. À savoir, les jointures.<br />
<br />
Dans cet article, nous allons travailler les jointures sur le côté « naturel » des relations via l’utilisation de clé primaires et de clé secondaires. Il est tout à fait possible de joindre 2 tables par des colonnes qui ne sont pas nécessairement la clé primaire. Cela arrive beaucoup lors d’utilisation d’ETL afin de vérifier si une donnée existe ou non dans une table, mais ceci est un autre sujet que nous n’aborderons pas aujourd’hui.<br />
<br />
<b><font color="#0000FF">Modélisation</font></b><br />
<br />
Beaucoup de sites et tutoriaux abordent le sujet de la modélisation (Notamment l’excellent blog de <a href="http://sqlpro.developpez.com/cours/modelisation/merise/" target="_blank">SQLPro</a> aussi, je ne m’y attarderais pas. Non pas que je ne souhaite pas le faire, mais je pense sincèrement que s’attarder sur ce point n’a plus d’intérêt tant le sujet a été débattu et traité par des confrères et que je n’ai rien à apporter à ce qui a déjà été dit pour le moment.<br />
<br />
<b><font color="#0000FF">Les Jointures</font></b><br />
<br />
Ce que l’on nomme « jointure », mot un peu étrange mais parfaitement représentatif de ce qu’il se passe derrière la ligne de code que vous tapez.<br />
Concrètement, la jointure est-ce qui permet au SGBD de faire le lien entre les données des tables que vous voulez exploiter.<br />
Pour nous aider à nous représenter ce « lien », nous allons générer un modèle, simple pour commencer, que nous étofferons au fur et à mesure de notre étude.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">DATABASE</span> JointuresSQL;
<span style="color: #0000ff;">GO</span>
&nbsp;
<span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TABLE</span> dbo.T_SERVICES
<span class="br0">&#40;</span> SER_ID         <span style="color: #0000ff;">INT</span> <span style="color: #0000ff;">IDENTITY</span><span class="br0">&#40;</span><span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>
, SER_NOM         <span style="color: #0000ff;">VARCHAR</span><span class="br0">&#40;</span>  <span style="color: #cc66cc;">50</span> <span class="br0">&#41;</span>
, <span style="color: #0000ff;">PRIMARY</span> <span style="color: #0000ff;">KEY</span> <span class="br0">&#40;</span>SER_ID <span class="br0">&#41;</span>
<span class="br0">&#41;</span>;
<span style="color: #0000ff;">GO</span>
&nbsp;
<span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TABLE</span> dbo.T_PERSONNEL
<span class="br0">&#40;</span> PER_ID     <span style="color: #0000ff;">INT</span> <span style="color: #0000ff;">IDENTITY</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>
, PER_NOM    <span style="color: #0000ff;">VARCHAR</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">80</span> <span class="br0">&#41;</span>
, PER_PRENOM <span style="color: #0000ff;">VARCHAR</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">80</span> <span class="br0">&#41;</span>
, PER_SER_ID <span style="color: #0000ff;">INT</span>
<span style="color: #0000ff;">PRIMARY</span> <span style="color: #0000ff;">KEY</span> <span class="br0">&#40;</span>PER_ID<span class="br0">&#41;</span>,
<span style="color: #0000ff;">FOREIGN</span> <span style="color: #0000ff;">KEY</span> <span class="br0">&#40;</span>PER_SER_ID<span class="br0">&#41;</span> <span style="color: #0000ff;">REFERENCES</span> dbo.SERVICES<span class="br0">&#40;</span> SER_ID <span class="br0">&#41;</span>
<span class="br0">&#41;</span>;
<span style="color: #0000ff;">GO</span>
&nbsp;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.SERVICES<span class="br0">&#40;</span> SER_NOM <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'Direction'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.SERVICES<span class="br0">&#40;</span> SER_NOM <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'Service Comptable'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.SERVICES<span class="br0">&#40;</span> SER_NOM <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'P&ocirc;le BI'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.SERVICES<span class="br0">&#40;</span> SER_NOM <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'P&ocirc;le CRM'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.SERVICES<span class="br0">&#40;</span> SER_NOM <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'P&ocirc;le Data Quality'</span> <span class="br0">&#41;</span>;
&nbsp;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'BERNARD'</span>    , <span style="color: #FF0000;">'Jacques'</span>    , <span style="color: #cc66cc;">1</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'DUPONT'</span>     , <span style="color: #FF0000;">'Mathilda'</span>   , <span style="color: #cc66cc;">2</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'ROMERO'</span>     , <span style="color: #FF0000;">'George'</span>     , <span style="color: #cc66cc;">2</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'CALBERA'</span>    , <span style="color: #FF0000;">'Deborah'</span>    , <span style="color: #cc66cc;">4</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'TONETTY'</span>    , <span style="color: #FF0000;">'Aldo'</span>       , <span style="color: #cc66cc;">3</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'ALDERAN'</span>    , <span style="color: #FF0000;">'C&eacute;lyna'</span>     , <span style="color: #cc66cc;">3</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'ZATAN'</span>      , <span style="color: #FF0000;">'Zlatan'</span>     , <span style="color: #cc66cc;">4</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'DUMONT'</span>     , <span style="color: #FF0000;">'Fran&ccedil;ois'</span>   , <span style="color: #cc66cc;">5</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'LEPR&Eacute;'</span>      , <span style="color: #FF0000;">'Jean'</span>       , <span style="color: #cc66cc;">5</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'JENLAIN'</span>    , <span style="color: #FF0000;">'Jean-Michel'</span>, <span style="color: #cc66cc;">5</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'DELCROIX'</span>   , <span style="color: #FF0000;">'Florent'</span>    , <span style="color: #cc66cc;">4</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'DELVALL&Eacute;E'</span>  , <span style="color: #FF0000;">'Amandine'</span>   , <span style="color: #cc66cc;">3</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'LEGRAND'</span>    , <span style="color: #FF0000;">'Nicolas'</span>    , <span style="color: #cc66cc;">3</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'LEBON'</span>      , <span style="color: #FF0000;">'Francis'</span>    , <span style="color: #cc66cc;">4</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'DUPONT'</span>     , <span style="color: #FF0000;">'LAURA'</span>      , <span style="color: #cc66cc;">3</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'DELARUE'</span>    , <span style="color: #FF0000;">'DELPHINE'</span>   , <span style="color: #cc66cc;">4</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'DELABELIERE'</span>, <span style="color: #FF0000;">'ROBIN'</span>      , <span style="color: #cc66cc;">3</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'SOUSLARUE'</span>  , <span style="color: #FF0000;">'YANN'</span>       , <span style="color: #cc66cc;">3</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'ROSAY'</span>      , <span style="color: #FF0000;">'ANTHONY'</span>    , <span style="color: #cc66cc;">5</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'DECAUX'</span>     , <span style="color: #FF0000;">'MATHIEU'</span>    , <span style="color: #cc66cc;">5</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'BENALAI'</span>    , <span style="color: #FF0000;">'CORINNE'</span>    , <span style="color: #cc66cc;">4</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'SURBLE'</span>     , <span style="color: #FF0000;">'ROSE'</span>       , <span style="color: #cc66cc;">4</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'SARGI'</span>      , <span style="color: #FF0000;">'SEBASTIEN'</span>  , <span style="color: #cc66cc;">3</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_PERSONNEL <span class="br0">&#40;</span> PER_NOM, PER_PRENOM, PER_SER_ID <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #FF0000;">'BENISEAU'</span>   , <span style="color: #FF0000;">'MATHIS'</span>     , <span style="color: #cc66cc;">3</span> <span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
Nous allons représenter les différents services d’une entreprise ainsi que les personnes qui la composent. Ce lien est physiquement représenté par la présence du champ PER_SER_ID dans la table T_PERSONNEL.<br />
<br />
Ce champ doit nous servir pour ressortir les différentes informations recherches.<br />
<br />
Ex : nous souhaitons récupérer la liste du personnel du Pôle CRM.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">SELECT</span> P.PER_NOM   
     , P.PER_PRENOM
  <span style="color: #0000ff;">FROM</span> T_PERSONNEL P
       <span style="color: #0000ff;">INNER</span> <span style="color: #0000ff;">JOIN</span> T_SERVICES S <span style="color: #0000ff;">ON</span> P.PER_SER_ID = T.SER_ID
 <span style="color: #0000ff;">WHERE</span> S.SER_NOM = <span style="color: #FF0000;">'P&ocirc;le CRM'</span>;</pre></td></tr></table></pre>
</div><br />
La requête, simple, nous permet de joindre les lignes de la table PERSONNEL aux lignes de la table SERVICES par l’identifiant commun qu’il y a dans les 2. Ainsi, le code nous ressortira l’ensemble des données contenues dans la table PERSONNEL faisant partie du département « Pôle CRM »<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p221341d1475006879/c-cpp/outils-c-cpp/cppbuilder/ajouter-aide/resultat-inner-join.jpg/" border="0" alt="Nom : Résultat Inner join.jpg
Affichages : 1235
Taille : 26,8 Ko"  style="float: CONFIG" /></div><br />
Ceci est la relation la plus simple que l’on puisse avoir entre deux tables. Une relation (1,n) traduite par une jointure interne et qui ne ressortira que les informations dont la condition est vraie dans les 2 sens. (Dans notre cas, l’identifiant 4 pour le pôle CRM)<br />
<br />
<b><font color="#0000FF">Les types de jointures</font></b><br />
<br />
Comme vous avez pu le constater lors de vos études en modélisation, il n’existe pas qu’un seul type de relations entre les éléments d’une base. Voici les différents types de jointures que vous pourrez retrouver ainsi que quelques subtilités qui les caractérisent.<br />
<br />
<b><font color="#0000FF">INNER JOIN</font></b><br />
<br />
<b>Vu plus au-dessus, elle permet de ressortir les lignes quand les conditions sont remplies dans les 2 tables liées par la jointure. C’est la plus simple des jointures.</b><br />
<br />
Le schéma ci-dessous représente le résultat d’une requête INNER JOIN. Seule la partie commune aux deux tables est extraite.<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p221342d1475007345/c-cpp/outils-c-cpp/cppbuilder/ajouter-aide/effet-inner-join.jpg/" border="0" alt="Nom : Effet INNER JOIN.jpg
Affichages : 1319
Taille : 19,0 Ko"  style="float: CONFIG" /><br />
<br />
<b>Schéma INNER JOIN</b></div><br />
<b><font color="#0000FF">CROSS JOIN</font></b><br />
<br />
Une jointure « croisée », c’est ce qu’on appelle un produit cartésien. Le SGBD va croiser chaque ligne de la première table, avec chaque ligne de la deuxième table.<br />
Ex :  <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> T_PERSONNEL
       <span style="color: #0000ff;">CROSS</span> <span style="color: #0000ff;">JOIN</span> T_SERVICES</pre></td></tr></table></pre>
</div><br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p221345d1475008050/c-cpp/outils-c-cpp/cppbuilder/ajouter-aide/resultat-cross-join.jpg/" border="0" alt="Nom : Résultat cross join.jpg
Affichages : 1198
Taille : 132,9 Ko"  style="float: CONFIG" /></div><br />
Que constatez-vous ?<br />
<br />
<ul><li style="">Que chaque élément de la table T_SERVICES se retrouve « accolé » à chaque élément de la table T_PERSONNEL.</li></ul><br />
<br />
Pour faciliter la « lecture » vous pouvez rajouter un filtre sur un service, vous verrez alors votre jeu de données limiter à x*1 (X étant le nombre d’éléments de la table T_PERSONNEL)<br />
Le CROSS JOIN peut s’avérer « dangereux », si vous faites le produit cartésien d’une table contenant de gros volumes de données (plusieurs millions de lignes) sur une autre table, vous pouvez vous retrouver avec un nombre de lignes généré parfois hors norme. (1 Million * 1 Million = 1 000 000 000 000) Ça laisse songeur !!<br />
<br />
<b><font color="#0000FF">LEFT [OUTER] JOIN</font></b><br />
<br />
Le schéma ci-dessous représente le résultat d’une requête LEFT JOIN. Toutes les données de la table de gauche ressortiront. En « bonus » les informations communes de la table de droite apparaitront aussi.<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p221343d1475007736/c-cpp/outils-c-cpp/cppbuilder/ajouter-aide/effet-left-join.jpg/" border="0" alt="Nom : Effet LEFT JOIN.jpg
Affichages : 1250
Taille : 18,8 Ko"  style="float: CONFIG" /><br />
<b>Schéma LEFT JOIN</b></div><br />
La jointure Externe gauche permet d’obtenir un résultat sur des lignes mêmes si elles ne sont pas présentes dans les 2 tables. Le choix du terme LEFT est assez simple, mettez votre requête sur une seule ligne (c’est moche, mais facile à comprendre ainsi !) et bien, la table à gauche des mot clés « LEFT JOIN » (la jointure) et qui est appelée dans les éléments de jointures sera la table « maitresse » de la requête.<br />
OUTER étant optionnel, je le place entre []<br />
<br />
<ul><li style="">Tous les éléments non filtrés de la table apparaitront, et ce, même s’il n’y a pas de liens dans la deuxième table.</li></ul><br />
<br />
Pour notre exemple, nous allons rajouter un service dans la table T_SERVICES et tester la jointure.<br />
Vous pourrez constater (et voir la différence en exécutant la précédente requête en INNER JOIN)<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:120px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.T_SERVICES<span class="br0">&#40;</span> SER_NOM <span class="br0">&#41;</span> <span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span> <span style="color: #FF0000;">'Service Commercial'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">GO</span>
&nbsp;
&nbsp;
<span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> dbo.T_SERVICES S
       <span style="color: #0000ff;">LEFT</span> <span style="color: #0000ff;">JOIN</span> dbo.T_PERSONNEL P <span style="color: #0000ff;">ON</span> P.PER_SER_ID = S.SER_ID</pre></td></tr></table></pre>
</div><br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p221344d1475008007/c-cpp/outils-c-cpp/cppbuilder/ajouter-aide/resultat-left-join.jpg/" border="0" alt="Nom : Résultat LEFT JOIN.jpg
Affichages : 1190
Taille : 29,5 Ko"  style="float: CONFIG" /></div><br />
Ici, nous pouvons constater que le Service Commercial n’a pas de personnes qui lui sont affectées, et que donc, le SGBD ressort 1 ligne, avec les éléments de la table T_PERSONNEL à NULL.<br />
<br />
<b><font color="#0000FF">RIGHT [OUTER] JOIN</font></b><br />
<br />
Le Schéma ci-dessous représente le résultat d’une requête RIGHT JOIN. Toutes les données de la table de droite ressortiront. En « bonus » les informations communes de la table de droite apparaitront aussi.<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p221346d1475008166/c-cpp/outils-c-cpp/cppbuilder/ajouter-aide/effet-right-join.jpg/" border="0" alt="Nom : Effet RIGHT JOIN.jpg
Affichages : 1290
Taille : 18,4 Ko"  style="float: CONFIG" /><br />
<b>Schéma RIGHT JOIN</b></div><br />
La jointure externe droite est, intrinsèquement, la même chose que la jointure gauche, avec la seule différence que la table « maitresse » se situe à droite de la commande RIGHT JOIN<br />
Essayez d’exécuter la requête en ne changeant que LEFT par RIGHT. Vous pourrez constater un petit changement dans le résultat !<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> dbo.T_SERVICES S
       <span style="color: #0000ff;">RIGHT</span> <span style="color: #0000ff;">JOIN</span> dbo.T_PERSONNE L P <span style="color: #0000ff;">ON</span> P.PER_SER_ID = S.SER_ID</pre></td></tr></table></pre>
</div><br />
<ol class="decimal"><li style="">la ligne 25, représentant une donnée non-existante dans la table T_PERSONNEL ne s’affiche plus. En effet, la table maitresse étant celle ou les données sont manquantes, la ligne ne peut apparaitre.</li><li style="">L’ordre des données a changé. Dans la première requête, l’ordre est basé sur les données d’insertion de la table T_SERVICES. Ici, sur les données d’insertion de la table T_PERSONNEL.</li></ol><br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p221347d1475008375/c-cpp/outils-c-cpp/cppbuilder/ajouter-aide/resultat-right-join.jpg/" border="0" alt="Nom : Résultat RIGHT JOIN.jpg
Affichages : 1128
Taille : 22,3 Ko"  style="float: CONFIG" /></div><br />
<b><font color="#0000FF">FULL JOIN</font></b><br />
<br />
Le Schéma ci-dessous représente le résultat d’une requête FULL JOIN. L’ensemble des données de deux tables sera sélectionné dans le résultat de la requête. Les parties non communes seront marquées d’un NULL pour tous les champs sans correspondances.<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p221348d1475008447/c-cpp/outils-c-cpp/cppbuilder/ajouter-aide/resultat-full-join.jpg/" border="0" alt="Nom : Résultat FULL JOIN.jpg
Affichages : 1265
Taille : 18,1 Ko"  style="float: CONFIG" /><br />
<b>Schéma FULL JOIN</b></div><br />
	Le FULL JOIN est une jointure peu utilisée, car parfois très consommatrice en performances. Un FULL JOIN porte littéralement son nom, il va faire une jointure totale entre les 2 tables et fournir un jeu de données à partir du moment où une ligne est présente dans l’une des deux tables.<br />
C’est comme si vous faisiez un RIGHT et un LEFT JOIN en même temps. Les Colonnes sans correspondance d’une table apparaitront à NULL. Vous l’aurez compris, si votre modèle de données est normé, vous ne devriez pas avoir de cas de données orphelines dans les 2 tables. La table fille ne peut avoir de référence NULL.<br />
<br />
<b><font color="#0000FF">SELF JOIN ou AUTO-JOINTURE</font></b><br />
<br />
<b><font color="#FF0000">Il est à noter que « SELF » n’est pas à proprement parler un mot-clé, il s’agit plutôt d’une information nous indiquant qu’une table s’auto-référence.</font></b><br />
	Ce cas est le moyen le plus simple de calculer une hiérarchie. Il s’agit, pour une table utilisée dans une jointure, d’être jointe à elle-même. Comme la théorie pour ce genre de cas peut être particulièrement abstraite et peut paraitre illogique, nous allons adapter notre modèle de données, pour lui faire correspondre à notre besoin.<br />
<br />
<ul><li style="">Ajoutons un élément permettant de gérer la hiérarchie. (a.	De façon logique, une hiérarchie est un lien entre 2 éléments d’une table.)</li></ul><br />
Ex : BERNARD Jacques, est dans notre modèle à la direction. Comme il est seul, nous supposons qu’il est le Directeur de l’entreprise.<br />
Nous allons choisir 1 personne dans chaque service, elle  va devenir arbitrairement « chef du service » et nous allons leur assigner, BERNARD Jacques comme chef. Puis, nous mettrons les personnes de chaque service sous la responsabilité du chef de service.<br />
<br />
Comment cela va se traduire ?<br />
<br />
<ul><li style="">Par l’ajout d’une colonne « RESP_ID » dans la table du personnel.</li><li style="">Par la création d’un lien entre responsable et collaborateur</li></ul><br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">USE</span> JointuresSQL;
<span style="color: #0000ff;">GO</span>
&nbsp;
<span style="color: #0000ff;">ALTER</span> <span style="color: #0000ff;">TABLE</span> dbo.T_PERSONNEL <span style="color: #0000ff;">ADD</span> PER_RESP_ID <span style="color: #0000ff;">INT</span> <span style="color: #0000ff;">NULL</span>;
&nbsp;
<span style="color: #0000ff;">UPDATE</span> dbo.T_PERSONNEL
   <span style="color: #0000ff;">SET</span> PER_RESP_ID = <span style="color: #cc66cc;">1</span>
 <span style="color: #0000ff;">WHERE</span> PER_NOM    = <span style="color: #FF0000;">'DUPONT'</span>
   <span style="color: #0000ff;">AND</span> PER_PRENOM = <span style="color: #FF0000;">'Mathilda'</span>;
&nbsp;
<span style="color: #0000ff;">UPDATE</span> dbo.T_PERSONNEL
   <span style="color: #0000ff;">SET</span> PER_RESP_ID = <span style="color: #cc66cc;">1</span>
 <span style="color: #0000ff;">WHERE</span> PER_NOM    = <span style="color: #FF0000;">'CALBERA'</span>
   <span style="color: #0000ff;">AND</span> PER_PRENOM = <span style="color: #FF0000;">'Deborah'</span>;
&nbsp;
<span style="color: #0000ff;">UPDATE</span> dbo.T_PERSONNEL
   <span style="color: #0000ff;">SET</span> PER_RESP_ID = <span style="color: #cc66cc;">1</span>
 <span style="color: #0000ff;">WHERE</span> PER_NOM    = <span style="color: #FF0000;">'TONETTY'</span>
   <span style="color: #0000ff;">AND</span> PER_PRENOM = <span style="color: #FF0000;">'Aldo'</span>;
&nbsp;
<span style="color: #0000ff;">UPDATE</span> dbo.T_PERSONNEL
   <span style="color: #0000ff;">SET</span> PER_RESP_ID = <span style="color: #cc66cc;">1</span>
 <span style="color: #0000ff;">WHERE</span> PER_NOM    = <span style="color: #FF0000;">'TONETTY'</span>
   <span style="color: #0000ff;">AND</span> PER_PRENOM = <span style="color: #FF0000;">'Aldo'</span>;
&nbsp;
<span style="color: #0000ff;">UPDATE</span> dbo.T_PERSONNEL
   <span style="color: #0000ff;">SET</span> PER_RESP_ID = <span style="color: #cc66cc;">1</span>
 <span style="color: #0000ff;">WHERE</span> PER_NOM    = <span style="color: #FF0000;">'DUMONT'</span>
   <span style="color: #0000ff;">AND</span> PER_PRENOM = <span style="color: #FF0000;">'Fran&ccedil;ois'</span>;	
&nbsp;
<span style="color: #0000ff;">UPDATE</span> dbo.T_PERSONNEL
   <span style="color: #0000ff;">SET</span> PER_RESP_ID = <span style="color: #cc66cc;">2</span>
 <span style="color: #0000ff;">WHERE</span> PER_SER_ID = <span style="color: #cc66cc;">2</span>
   <span style="color: #0000ff;">AND</span> PER_ID != <span style="color: #cc66cc;">2</span>;
&nbsp;
<span style="color: #0000ff;">UPDATE</span> dbo.T_PERSONNEL
   <span style="color: #0000ff;">SET</span> PER_RESP_ID = <span style="color: #cc66cc;">5</span>
 <span style="color: #0000ff;">WHERE</span> PER_SER_ID = <span style="color: #cc66cc;">3</span>
   <span style="color: #0000ff;">AND</span> PER_ID != <span style="color: #cc66cc;">5</span>;
&nbsp;
<span style="color: #0000ff;">UPDATE</span> dbo.T_PERSONNEL
   <span style="color: #0000ff;">SET</span> PER_RESP_ID = <span style="color: #cc66cc;">4</span>
 <span style="color: #0000ff;">WHERE</span> PER_SER_ID = <span style="color: #cc66cc;">4</span>
   <span style="color: #0000ff;">AND</span> PER_ID != <span style="color: #cc66cc;">4</span>;
&nbsp;
<span style="color: #0000ff;">UPDATE</span> dbo.T_PERSONNEL
   <span style="color: #0000ff;">SET</span> PER_RESP_ID = <span style="color: #cc66cc;">8</span>
 <span style="color: #0000ff;">WHERE</span> PER_SER_ID = <span style="color: #cc66cc;">5</span>
   <span style="color: #0000ff;">AND</span> PER_ID != <span style="color: #cc66cc;">8</span>;</pre></td></tr></table></pre>
</div><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:156px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">SELECT</span> PER.PER_SER_ID <span style="color: #0000ff;">AS</span> ID_SERVICE
     , RES.PER_NOM    <span style="color: #0000ff;">AS</span> RESP_NOM
     , RES.PER_PRENOM <span style="color: #0000ff;">AS</span> RESP_PRENOM
     , PER.PER_NOM    <span style="color: #0000ff;">AS</span> PER_NOM
     , PER.PER_PRENOM <span style="color: #0000ff;">AS</span> PER_PRENOM
  <span style="color: #0000ff;">FROM</span> dbo.T_PERSONNEL <span style="color: #0000ff;">AS</span> PER
       <span style="color: #0000ff;">RIGHT</span> <span style="color: #0000ff;">JOIN</span> dbo.T_PERSONNEL <span style="color: #0000ff;">AS</span> RES <span style="color: #0000ff;">ON</span> PER.PER_RESP_ID = RES.PER_ID
 <span style="color: #0000ff;">WHERE</span> PER.PER_NOM <span style="color: #0000ff;">IS</span> <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULL</span>
 <span style="color: #0000ff;">ORDER</span> <span style="color: #0000ff;">BY</span> PER.PER_SER_ID, RES.PER_NOM, RES.PER_PRENOM
;</pre></td></tr></table></pre>
</div><br />
Vous pourrez constater qu’il va manquer quelques précisions dans le classement des personnes (à savoir qui est le directeur de l’entreprise et qu'il devrait se situer en haut).<br />
Il est à noter que les normes SQL ont énormément évolué et que des méthodes ont été mises en place pour permettre de gérer au mieux une hiérarchie. (Voir <a href="http://www.developpez.net/forums/blogs/135170-lyche/b1422/cte/" target="_blank">Mon cours sur les CTE</a> et requêtes récursives). Nous n’aborderons pas le sujet ici, car il nécessite une assez bonne connaissance de SQL pour l’appréhender.<br />
<br />
<b><font color="#0000FF">NATURAL JOIN</font></b><br />
<br />
	Le NATURAL JOIN est une norme permettant la « simplification » de l’écriture de requêtes. Elle utilise l’intelligence du moteur de données, à partir du moment où on lui mâche un peu le travail, en nommant les FK des tables filles comme le nom de la colonne d’origine.<br />
Dans notre cas, il nous faudrait remplacer le nom de la colonne T_PERSONNEL.PER_SER_ID en T_PERSONNEL.SER_ID<br />
Et la requête s’écrirait ainsi<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> T_PERSONNEL
       <span style="color: #0000ff;">NATURAL</span> <span style="color: #0000ff;">JOIN</span> T_SERVICES</pre></td></tr></table></pre>
</div><br />
C’est immédiatement plus lisible, mais aussi plus « gourmand » et demande au SGBD un peu plus d’efforts pour appliquer les jointures et calculer son plan d’exécution.<br />
Personnellement, je ne m’en sers jamais. Simplement parce que toutes les autres jointures comportent la clause ON qui permettent de voir en un coup d’œil quelles sont les colonnes de jointures entre les tables et qu’avoir des écritures différentes dans une même requête peut brouiller la lecture. De plus, les performances de vos requêtes se trouvent affectées par le fait que le SGBD doit fournir un effort supplémentaire d’identification des liaisons entre tables. Sur de petites volumétries, cela ne gêne pas, mais il ne faut jamais oublier qu’une base de données est destinée à vivre longtemps, et qu’à forte volumétrie comme sur lesquelles j’ai pu travailler (entre 1 et 5 milliards de lignes), cela s’avère être source de ralentissement.<br />
<br />
<br />
<b><font color="#0000FF">CAS PARTICULIERS :</font></b><br />
<br />
<b><font color="#0000FF">EXISTS</font></b><br />
<br />
EXISTS n’est pas, à proprement parler une jointure. En effet, sa forme première d’utilisation est de déclencher ou non une requête si une donnée existe en tant que résultat d’une sous-requête. C’est-à-dire qu’à partir du moment, où il y aura au moins 1 ligne retournée dans la sous-requête, alors l’ensemble de la requête sera exécuté, sinon, il ne se passera rien. (C’est une sorte de « IF » plus « classe »)<br />
<br />
Mais il existe une autre forme de « EXISTS ». Elle consiste à lier le résultat de la sous-requête aux lignes de la requête principale. Le principe d’une jointure étant de relier les tables par une égalité sur un à n champs.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:180px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">-- Forme premi&egrave;re du EXISTS</span>
<span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> T_SERVICES
 <span style="color: #0000ff;">WHERE</span> <span style="color: #0000ff;">EXISTS</span> <span class="br0">&#40;</span> <span style="color: #0000ff;">SELECT</span> <span style="color: #cc66cc;">1</span>
                  <span style="color: #0000ff;">FROM</span> T_PERSONNEL <span class="br0">&#41;</span>;
&nbsp;
<span style="color: #808080;">-- 2&egrave;me forme du EXISTS</span>
<span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> T_SERVICES
 <span style="color: #0000ff;">WHERE</span> <span style="color: #0000ff;">EXISTS</span> <span class="br0">&#40;</span> <span style="color: #0000ff;">SELECT</span> <span style="color: #cc66cc;">1</span>
                  <span style="color: #0000ff;">FROM</span> T_PERSONNEL
                 <span style="color: #0000ff;">WHERE</span> T_SERVICES.SER_ID = T_PERSONNEL.PER_SER_ID <span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
On peut constater que la première version n’applique pas de filtre. Si l’on remplace le « EXISTS » par un « NOT EXISTS », il n’y aura plus de données du tout. La requête principale ne ressortira pas de données, car il y a des données alors que nous n’en voulons pas.<br />
La deuxième forme de EXISTS, va reproduire pratiquement le même effet qu’un INNER JOIN et permettra de lister les services dans lesquels il y a au moins une personne.<br />
Le gros avantage, et c’est pour cette raison que je place la clause EXISTS dans les « pseudo jointures » c’est qu’on peut reproduire l’effet d’un INNER JOIN, sans avoir les contraintes de doublons générés par une relation 1,n. Mais il devient impossible de remonter les données de la table dans le EXISTS sous la forme de colonnes.<br />
N.B : Vous aurez probablement constaté le « SELECT 1 » de la sous requête. Il est important de savoir et comprendre que l’important c’est pas le résultat du SELECT, mais, dans la première forme qu’il y ait une valeur quelle qu’elle soit, et dans la 2ème forme, que l’égalité existe ou non. Le SELECT dans la 2ème forme n’est même pas lu par la requête principale.<br />
<br />
<b><font color="#0000FF">FILTRES ET PRE FILTRES</font></b><br />
<br />
	 La plupart des personnes pratiquantes du SQL savent faire des requêtes avec des jointures simples et des filtres. Moins nombreux sont ceux qui savent faire la différence entre un filtre (clause WHERE) et un préfiltre.<br />
Un filtre, ça sert à limiter le nombre de lignes que l’on souhaite faire apparaitre en résultat d’un select. C’est ce qu’on appelle communément les règles de gestion (RG). Mais, il est possible, lorsque l’on travaille avec du LEFT/RIGHT JOIN d’appliquer un premier filtre à une table afin de ne pas nous perturber avec des données qui ne nous intéressent pas en provenance d’une table jointe.<br />
Exemple :<br />
Je souhaite connaitre les personnes de la direction. Un filtre normal s’applique et nous aurons 1 ligne.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">-- 1 - Filtre sur les personnes du service Direction</span>
&nbsp;
<span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> dbo.T_PERSONNEL P
       <span style="color: #0000ff;">LEFT</span> <span style="color: #0000ff;">JOIN</span> dbo.T_SERVICES S <span style="color: #0000ff;">ON</span> P.PER_SER_ID = S.SER_ID
 <span style="color: #0000ff;">WHERE</span> S.SER_ID = <span style="color: #cc66cc;">1</span>;</pre></td></tr></table></pre>
</div><br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p221351d1475009704/c-cpp/outils-c-cpp/cppbuilder/ajouter-aide/resultat-filtre-direction.jpg/" border="0" alt="Nom : Résultat Filtre Direction.jpg
Affichages : 1084
Taille : 18,0 Ko"  style="float: CONFIG" /></div><br />
Comme attendu, notre filtre nous remonte l’ensemble des lignes dont les personnes sont affiliées au service « Direction ».<br />
Cependant, il est parfois nécessaire de conserver l’ensemble des données d’une table, mais de n’afficher que certaines données, et ce, pour mettre en exergue certains faits.<br />
Dans la requête suivante, on pourrait croire que cette personne est seule dans son entreprise, hors, il n’en est rien. Appliquons le même filtre, mais en « préfiltre ».<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">--2 - Pr&eacute;-Filtre sur le service Direction</span>
<span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> dbo.T_PERSONNEL P
       <span style="color: #0000ff;">LEFT</span> <span style="color: #0000ff;">JOIN</span> dbo.T_SERVICES S <span style="color: #0000ff;">ON</span> P.PER_SER_ID = S.SER_ID
                                 <span style="color: #0000ff;">AND</span> S.SER_ID = <span style="color: #cc66cc;">1</span>;</pre></td></tr></table></pre>
</div><br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p221353d1475009861/c-cpp/outils-c-cpp/cppbuilder/ajouter-aide/resultat-pre-filtre-direction.jpg/" border="0" alt="Nom : Résultat Pré-Filtre Direction.jpg
Affichages : 1234
Taille : 40,0 Ko"  style="float: CONFIG" /></div><br />
Vous pouvez constater que la requête ne remonte les informations de la table T_SERVICES que pour la direction, mais que les autres personnes sont quand même présentes dans le résultat.<br />
	Il devient, ainsi, facile d’identifier telle ou telle personne dans une liste de nombreuses autres.<br />
Ce cas est plus courant qu’on ne le croit et bons nombres de résultats attendus peuvent se trouver faux à la suite d’une mauvaise application de RG entre le filtre et le pré filtre.<br />
<br />
<b><font color="#0000FF">Conclusion :</font></b><br />
<br />
Les normes SQL prévoient bon nombre de cas de lecture de données entre les tables. Les différentes jointures que nous avons étudiées dans ce document prennent en compte les différentes possibilités de liaisons de vos tables lorsque vous réalisez votre modèle. Si vous désirez progresser dans votre qualité de code SQL, il vous sera impératif de parfaitement maîtriser les jointures, qui en sont la base.<br />
<br />
<b><font color="#0000FF">Remerciements</font></b><br />
Je remercie Sylvain Del TATTO (minot83), Jean-Marie BAGNIS(jimbolion), Célia POTOT (Erielle) ainsi Frédérique Brossard (Directeur Adjoint au pôle BI chez MCNext) et Séverine CAPON (GeekMokona) pour leur relecture, conseil et correction qui m’ont permis de publier cet article.</blockquote>

]]></content:encoded>
			<dc:creator>Lyche</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/135170-lyche/b1660/jointures-sql/</guid>
		</item>
		<item>
			<title>Les CTE</title>
			<link>https://www.developpez.net/forums/blogs/135170-lyche/b1422/cte/</link>
			<pubDate>Tue, 07 Jun 2016 14:46:46 GMT</pubDate>
			<description>*Les sous-requêtes et leurs...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><b><font color="#0000FF">Les sous-requêtes et leurs utilisations</font></b><br />
<br />
Il est assez difficile de traiter d’un sujet comme les tables dérivées et les CTE (Common Table Expression) sans cas concrets. Les requêtes exemples ne sont pas toujours pertinentes et l’utilité des techniques comme les Tables Dérivées (que je nommerai TD dans la suite de l’article) n’est pas intuitive. N’hésitez pas à apporter des remarques dans les commentaires, je ferai en sorte d’y répondre rapidement.<br />
<br />
<b><font color="#0000FF">Présentation</font></b><br />
<br />
Suite à la rédaction de mon premier billet sur les agrégats, il m’a été demandé d’expliquer ce qu’étaient les CTE (Common Table Expression ou Expression de Tables Communes).<br />
Je vais profiter de ce billet pour donner une petite explication du terme ainsi que les comparer en termes d’utilité et de lisibilité à leurs ancêtres que sont les Tables dérivées.<br />
Côté performance, il n’y a pas d’écart à code égal. Je ne m’étendrai  pas sur ce sujet, d’autant que mon but est surtout la découverte de cette technique méconnue.<br />
<br />
<b><font color="#0000FF">Définition</font></b><br />
<br />
Les tables dérivées sont des requêtes  permettant d’extraire  un jeu de données exploitable dans une requête de niveau supérieur.<br />
Structure de données :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">DATABASE</span> DBTrainningCTE;
<span style="color: #0000ff;">GO</span>
<span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TABLE</span> dbo.TB_DEPARTEMENTS <span class="br0">&#40;</span>
  ID_DEPARTEMENT  <span style="color: #0000ff;">INT</span> <span style="color: #0000ff;">PRIMARY</span> <span style="color: #0000ff;">KEY</span>
, NOM_DEPARTEMENT <span style="color: #0000ff;">VARCHAR</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">50</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">GO</span>
&nbsp;
<span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TABLE</span> dbo.TB_EMPLOYES <span class="br0">&#40;</span>
  ID_EMPLOYE      <span style="color: #0000ff;">INT</span> <span style="color: #0000ff;">PRIMARY</span> <span style="color: #0000ff;">KEY</span>
, NOM_EMPLOYE     <span style="color: #0000ff;">VARCHAR</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">50</span> <span class="br0">&#41;</span> <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULL</span>
, AGE_EMPLOYE     <span style="color: #0000ff;">INT</span>
, DEPARTEMENT_ID  <span style="color: #0000ff;">INT</span>
, SALAIRE_EMPLOYE MONEY <span class="br0">&#41;</span>;
<span style="color: #0000ff;">GO</span>
&nbsp;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_DEPARTEMENTS
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">1</span>, <span style="color: #FF0000;">'Administration'</span>       <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_DEPARTEMENTS
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">2</span>, <span style="color: #FF0000;">'Ressources Humaines'</span>  <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_DEPARTEMENTS
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">3</span>, <span style="color: #FF0000;">'Service Informatique'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_DEPARTEMENTS
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">4</span>, <span style="color: #FF0000;">'Comptabilit&eacute;'</span>         <span class="br0">&#41;</span>;
&nbsp;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_EMPLOYES
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">1</span>, <span style="color: #FF0000;">'Georges'</span>, <span style="color: #cc66cc;">74</span>, <span style="color: #cc66cc;">4</span>, <span style="color: #cc66cc;">2480.3</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_EMPLOYES
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">2</span>, <span style="color: #FF0000;">'Pierre'</span> , <span style="color: #cc66cc;">17</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">1387.2</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_EMPLOYES
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">3</span>, <span style="color: #FF0000;">'Bernard'</span>, <span style="color: #cc66cc;">63</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">3499.8</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_EMPLOYES
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">4</span>, <span style="color: #FF0000;">'John'</span>   , <span style="color: #cc66cc;">23</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">1876.9</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_EMPLOYES
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">5</span>, <span style="color: #FF0000;">'J&eacute;rome'</span> , <span style="color: #cc66cc;">45</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">2286.6</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_EMPLOYES
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">6</span>, <span style="color: #FF0000;">'Lina'</span>, <span style="color: #cc66cc;">30</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">2230.4</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_EMPLOYES
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">7</span>, <span style="color: #FF0000;">'Marie'</span>, <span style="color: #cc66cc;">26</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">1980.4</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_EMPLOYES
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">8</span>, <span style="color: #FF0000;">'Virginie'</span>, <span style="color: #cc66cc;">37</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">2730.4</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_EMPLOYES
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">9</span>, <span style="color: #FF0000;">'H&eacute;l&egrave;ne'</span>, <span style="color: #cc66cc;">33</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">2430.4</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_EMPLOYES
<span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span> <span style="color: #cc66cc;">10</span>, <span style="color: #FF0000;">'Yuva'</span>, <span style="color: #cc66cc;">28</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">2200.2</span> <span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
<br />
<b><font color="#0000FF">Exemple</font></b><br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> <span class="br0">&#40;</span> <span style="color: #0000ff;">SELECT</span> Nom, Prenom
           <span style="color: #0000ff;">FROM</span> dbo.TB_EMPLOYES <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> TD <span style="color: #808080;">--TD Pour Table d&eacute;riv&eacute;e, mais je recommande un nom explicite pour les futurs lecteurs de votre code ;)</span>
 <span style="color: #0000ff;">WHERE</span> Nom = <span style="color: #FF0000;">'toto'</span>;</pre></td></tr></table></pre>
</div>Ceci est un exemple simple de table dérivée.<br />
<br />
<b><font color="#0000FF">Cas pratique</font></b><br />
<br />
Notre exemple simplifié doit nous permettre  d’envisager l’élaboration  d’une requête qui va lister un nombre de personnes.<br />
Listons, pour commencer nos employés dont l’âge est compris  entre 20 et 40 ans.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">SELECT</span> NOM_EMPLOYE   , AGE_EMPLOYE    ,
       DEPARTEMENT_ID, SALAIRE_EMPLOYE
  <span style="color: #0000ff;">FROM</span> dbo.TB_EMPLOYES
 <span style="color: #0000ff;">WHERE</span> AGE_EMPLOYE <span style="color: #0000ff;">BETWEEN</span> <span style="color: #cc66cc;">20</span> <span style="color: #0000ff;">AND</span> <span style="color: #cc66cc;">40</span>;</pre></td></tr></table></pre>
</div><br />
Le résultat sera le suivant :<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p212041d1465308870/c-cpp/outils-c-cpp/cppbuilder/recuperer-date-heure-modification-fichier-repert/r-sultat-td-1.jpg/" border="0" alt="Nom : R&#233;sultat TD 1.jpg
Affichages : 117807
Taille : 30,3 Ko"  style="float: CONFIG" /></div><br />
Ce résultat, peut être placé dans un « FROM », comme nous l’avons vu plus haut.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:120px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0"> <span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> <span class="br0">&#40;</span>
         <span style="color: #0000ff;">SELECT</span> NOM_EMPLOYE   , AGE_EMPLOYE    ,
                DEPARTEMENT_ID, SALAIRE_EMPLOYE
           <span style="color: #0000ff;">FROM</span> dbo.TB_EMPLOYES
          <span style="color: #0000ff;">WHERE</span> AGE_EMPLOYE <span style="color: #0000ff;">BETWEEN</span> <span style="color: #cc66cc;">20</span> <span style="color: #0000ff;">AND</span> <span style="color: #cc66cc;">40</span> <span class="br0">&#41;</span> TD
 <span style="color: #0000ff;">WHERE</span> SALAIRE_EMPLOYE &gt; <span style="color: #cc66cc;">2000</span></pre></td></tr></table></pre>
</div><br />
Si nous appliquons un filtre, on peut constater que certaines lignes vont être ignorées par l’application de la condition sur le salaire.<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p212042d1465309316/c-cpp/outils-c-cpp/cppbuilder/recuperer-date-heure-modification-fichier-repert/r-sultat-td-filtr-e.jpg/" border="0" alt="Nom : R&#233;sultat TD Filtr&#233;e.jpg
Affichages : 80216
Taille : 22,2 Ko"  style="float: CONFIG" /></div><br />
De façon simplifiée, voici comment on exploite une Table Dérivée. Nous pouvons aussi rajouter des jointures sur ces tables, puisque, le principe est de pouvoir les exploiter exactement comme s'il s’agissait d’un élément physique de votre base. (Vue, table).<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:120px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">SELECT</span> NOM_EMPLOYE, NOM_DEPARTEMENT, AGE_EMPLOYE
  <span style="color: #0000ff;">FROM</span> <span class="br0">&#40;</span>
         <span style="color: #0000ff;">SELECT</span> NOM_EMPLOYE   , AGE_EMPLOYE    ,
                DEPARTEMENT_ID, SALAIRE_EMPLOYE
           <span style="color: #0000ff;">FROM</span> dbo.TB_EMPLOYES
          <span style="color: #0000ff;">WHERE</span> AGE_EMPLOYE <span style="color: #0000ff;">BETWEEN</span> <span style="color: #cc66cc;">20</span> <span style="color: #0000ff;">AND</span> <span style="color: #cc66cc;">40</span> <span class="br0">&#41;</span> TD
        <span style="color: #0000ff;">INNER</span> <span style="color: #0000ff;">JOIN</span> dbo.TB_DEPARTEMENTS D <span style="color: #0000ff;">ON</span> TD.DEPARTEMENT_ID = D.ID_DEPARTEMENT <span style="color: #808080;">--Ici, la jointure se fait sur le r&eacute;sultat de la TD et sur l'ID_DEPARTEMENT de la table TB_DEPARTEMENT</span></pre></td></tr></table></pre>
</div><br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p212043d1465309374/c-cpp/outils-c-cpp/cppbuilder/recuperer-date-heure-modification-fichier-repert/r-sultat-td-and-jointure.jpg/" border="0" alt="Nom : R&#233;sultat TD &amp; Jointure.jpg
Affichages : 67910
Taille : 31,9 Ko"  style="float: CONFIG" /></div><br />
Le résultat montre bien que la jointure se fait exactement de la même façon que sur une requête « classique ».<br />
Maintenant, refaisons le même exercice, avec les CTE<br />
<br />
<b><font color="#0000FF">Définition</font></b><br />
<br />
Une CTE (ou Table d’Expression Commune) est une requête utilisée en tant que table à « usage unique ». C’est-à-dire qu’une fois déclarée, la CTE ne pourra être exploitée qu’immédiatement après.<br />
Ex. :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0">;<span style="color: #0000ff;">WITH</span> maCTE <span style="color: #0000ff;">AS</span> <span class="br0">&#40;</span>
<span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> maTable <span class="br0">&#41;</span>
&nbsp;
<span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> maCTE;</pre></td></tr></table></pre>
</div><br />
Si la moindre instruction SQL se glisse entre votre CTE et votre requête l’exploitant,  une erreur de syntaxe sera renvoyée.<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p212044d1465309514/c-cpp/outils-c-cpp/cppbuilder/recuperer-date-heure-modification-fichier-repert/erreur-cte.jpeg/" border="0" alt="Nom : Erreur CTE.jpeg
Affichages : 68525
Taille : 69,0 Ko"  style="float: CONFIG" /></div><br />
Il est cependant possible d’enchaîner plusieurs CTE  en les séparant par une virgule et d’exploiter toutes ces CTE depuis une même requête située immédiatement sous votre code.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:156px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td valign="top"><pre style="margin: 0">;<span style="color: #0000ff;">WITH</span> maCTE <span style="color: #0000ff;">AS</span> <span class="br0">&#40;</span>
<span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> maTable <span class="br0">&#41;</span>
, maCTE2 <span style="color: #0000ff;">AS</span> <span class="br0">&#40;</span>
<span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> maTable <span class="br0">&#41;</span>
&nbsp;
<span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> maCTE
       <span style="color: #0000ff;">INNER</span> <span style="color: #0000ff;">JOIN</span> maCTE2 <span style="color: #0000ff;">ON</span> maCTE.Cl&eacute; = maCTE2.Cl&eacute;<span style="color: #cc66cc;">2</span>;</pre></td></tr></table></pre>
</div><br />
N. B. Une CTE peut aussi en appeler une autre située au-dessus dans le code.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:156px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td valign="top"><pre style="margin: 0">;<span style="color: #0000ff;">WITH</span> maCTE <span style="color: #0000ff;">AS</span> <span class="br0">&#40;</span>
<span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> maTable <span class="br0">&#41;</span>
, maCTE2 <span style="color: #0000ff;">AS</span> <span class="br0">&#40;</span>
<span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> maCTE
       <span style="color: #0000ff;">INNER</span> <span style="color: #0000ff;">JOIN</span> maTable2 <span style="color: #0000ff;">ON</span> maCTE.Cl&eacute; = maTable2.Cl&eacute;<span style="color: #cc66cc;">2</span> <span class="br0">&#41;</span>
&nbsp;
<span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> maCTE2</pre></td></tr></table></pre>
</div><br />
L’utilité des CTE réside à mon humble avis, dans cette capacité de pouvoir organiser votre code en blocs sans surcoût au niveau des plans d’exécution. Une écriture claire avec des petits blocs spécifiques  vous permet d’intervenir aisément sur une portion précise sans avoir à revisiter tout votre code.<br />
<br />
<b><font color="#FF0000">Attention</font></b>, l’effet pervers de la multiplicité des petites requêtes peut finalement rendre illisible votre code, à chacun de trouver le bon compromis.   <br />
Bien entendu, leur utilité ne s’arrête pas là. <b>Nous détaillerons dans un prochain billet une utilisation avancée des CTE avec la récursion et les calculs hiérarchiques.</b><br />
<br />
<br />
<b><font color="#0000FF">Cas Pratique</font></b><br />
<br />
Comme pour les tables dérivées, nous allons voir comment nous pouvons l’utiliser de façon rudimentaire.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:120px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0">;<span style="color: #0000ff;">WITH</span> maCTE <span style="color: #0000ff;">AS</span> <span class="br0">&#40;</span> <span style="color: #808080;">--maCTE pour l'exemple, mais comme pour les TD, je recommande un nom explicite.</span>
<span style="color: #0000ff;">SELECT</span> FirstName, LastName
  <span style="color: #0000ff;">FROM</span> dbo.TB_EMPLOYES
<span class="br0">&#41;</span>
<span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> maCTE <span style="color: #808080;">--Appel &agrave; la CTE de la m&ecirc;me fa&ccedil;on que si c'&eacute;tait une table</span>
 <span style="color: #0000ff;">WHERE</span> Nom = <span style="color: #FF0000;">'toto'</span>;</pre></td></tr></table></pre>
</div><br />
N. B. Il n’y a aucune différence en termes de performance entre ces deux procédés.<br />
N.B. Une CTE ne peut fonctionner que si la précédente instruction se termine par un « ; » Personnellement, je le colle toujours devant la balise WITH.<br />
<br />
<b><font color="#0000FF">Cas Pratique</font></b><br />
<br />
Reprenons notre code précédent  et utilisons une CTE.<br />
Nous obtenons donc ceci :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:144px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0">;<span style="color: #0000ff;">WITH</span> maCTE <span style="color: #0000ff;">AS</span> <span class="br0">&#40;</span>
<span style="color: #0000ff;">SELECT</span> NOM_EMPLOYE   , AGE_EMPLOYE    ,
       DEPARTEMENT_ID, SALAIRE_EMPLOYE
  <span style="color: #0000ff;">FROM</span> dbo.TB_EMPLOYES
 <span style="color: #0000ff;">WHERE</span> AGE_EMPLOYE <span style="color: #0000ff;">BETWEEN</span> <span style="color: #cc66cc;">20</span> <span style="color: #0000ff;">AND</span> <span style="color: #cc66cc;">40</span> <span class="br0">&#41;</span>
&nbsp;
<span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> maCTE
 <span style="color: #0000ff;">WHERE</span> SALAIRE_EMPLOYE &gt; <span style="color: #cc66cc;">2000</span>;</pre></td></tr></table></pre>
</div><br />
Le résultat, comme prévu est exactement le même qu’avec une TD :<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p212042d1465309316/c-cpp/outils-c-cpp/cppbuilder/recuperer-date-heure-modification-fichier-repert/r-sultat-td-filtr-e.jpg/" border="0" alt="Nom : R&#233;sultat TD Filtr&#233;e.jpg
Affichages : 80216
Taille : 22,2 Ko"  style="float: CONFIG" /></div><br />
De même, les jointures s’établissent de façon naturelle.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:156px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
;<span style="color: #0000ff;">WITH</span> maCTE <span style="color: #0000ff;">AS</span> <span class="br0">&#40;</span>
<span style="color: #0000ff;">SELECT</span> NOM_EMPLOYE   , AGE_EMPLOYE    ,
       DEPARTEMENT_ID, SALAIRE_EMPLOYE
  <span style="color: #0000ff;">FROM</span> dbo.TB_EMPLOYES
 <span style="color: #0000ff;">WHERE</span> AGE_EMPLOYE <span style="color: #0000ff;">BETWEEN</span> <span style="color: #cc66cc;">20</span> <span style="color: #0000ff;">AND</span> <span style="color: #cc66cc;">40</span> <span class="br0">&#41;</span>
&nbsp;
<span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> maCTE
       <span style="color: #0000ff;">INNER</span> <span style="color: #0000ff;">JOIN</span> dbo.TB_DEPARTEMENTS D <span style="color: #0000ff;">ON</span> maCTE.DEPARTEMENT_ID = D.ID_DEPARTEMENT</pre></td></tr></table></pre>
</div><br />
Nous voyons donc que notre requête finale se simplifie et que notre code peut être facilement identifiable.<br />
<br />
<ul><li style="">Un nom de CTE Explicite</li><li style="">Quelques commentaires pour faciliter la lecture</li><li style="">Un nombre raisonnable de niveaux de CTE</li></ul><br />
<br />
Et vous aurez toutes les clés pour réussir une procédure stockée performante et maintenable ! (Par vous, comme par d’autres personnes.)</blockquote>

]]></content:encoded>
			<dc:creator>Lyche</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/135170-lyche/b1422/cte/</guid>
		</item>
		<item>
			<title><![CDATA[L'historisation de données via la fonction MERGE]]></title>
			<link>https://www.developpez.net/forums/blogs/135170-lyche/b1330/l-historisation-donnees-via-fonction-merge/</link>
			<pubDate>Tue, 03 May 2016 07:47:25 GMT</pubDate>
			<description>*Présentation* 
 
Ce document...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><b><font color="#0000FF">Présentation</font></b><br />
<br />
Ce document présente une technique de gestion des historiques de données assez particulière : le MERGE combiné à la clause OUTPUT. Microsoft a implémenté le MERGE, présente dans les normes SQL depuis 2003 et revue en 2008, à partir de SQL Server 2008.<br />
Cette fonctionnalité regroupe 3 fonctions SQL de base : INSERT, UPDATE, DELETE.<br />
<br />
<b><font color="#0000FF">Le MERGE</font></b><br />
<br />
Cette fonctionnalité permet de manager en une seule instruction SQL l’ensemble des mouvements possibles sur une table, souvent nommée « TARGET » ou « T ». La source de la modification peut être une requête, une vue ou un CTE (Common Table Expression). En fonction des jointures définies entre la TARGET et la SOURCE, le MERGE permet de définir les lignes à insérer, mettre à jour ou supprimer.<br />
<br />
Il est à noter qu’il est possible  de compléter le critère de jointure de base, (définissant la relation entre la TARGET et la SOURCE) dans la clause (NOT) MATCH d’un filtre, ce qui offre l'avantage d’être très précis sur les actions à entreprendre. Il sera, par exemple, possible de choisir un critère pour mettre à jour une ligne et pas une autre.<br />
Il est aussi envisageable de filtrer les lignes à supprimer ; les autres données, pourront être insérées ou ignorées, au choix (bien qu'ignorer des données relève d'une mauvaise application des règles dans la source).<br />
<br />
La syntaxe du MERGE est : <br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:144px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">MERGE</span> <span style="color: #0000ff;">INTO</span> <span style="color: black;">[base]</span>.<span style="color: black;">[schema]</span>.<span style="color: black;">[table]</span> <span style="color: #0000ff;">AS</span> TARGET
<span style="color: #0000ff;">USING</span> <span class="br0">&#40;</span> <span style="color: #0000ff;">SELECT</span> *
          <span style="color: #0000ff;">FROM</span> maSource <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> SOURCE <span style="color: #0000ff;">ON</span> TARGET.Cl&eacute; = SOURCE.Cl&eacute;
 <span style="color: #0000ff;">WHEN</span> <span style="color: #0000ff;">MATCHED</span> <span style="color: #0000ff;">THEN</span> <span style="color: #0000ff;">UPDATE</span>
  <span style="color: #0000ff;">SET</span> Champ1 = SOURCE.Champ1
    , Champ2 = SOURCE.Champ2
 <span style="color: #0000ff;">WHEN</span> <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">MATCHED</span> <span style="color: #0000ff;">THEN</span>
<span style="color: #0000ff;">INSERT</span> <span class="br0">&#40;</span>        Champ1,        Champ2,        Champ3 <span class="br0">&#41;</span>
<span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span> SOURCE.Champ1, SOURCE.Champ2, SOURCE.Champ3 <span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
Cette forme est la construction la plus simple du MERGE. Il est à noter qu’un MATCHED ne fonctionne qu’une seule fois par action effectuée. (UPDATE ou DELETE) <br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">WHEN</span> <span style="color: #0000ff;">MATCHED</span> <span style="color: #0000ff;">AND</span> Champ3 = <span style="color: #FF0000;">'OK'</span> <span style="color: #0000ff;">THEN</span> <span style="color: #0000ff;">UPDATE</span>
 <span style="color: #0000ff;">SET</span> Champ1 = SOURCE.Champ1
   , Champ2 = SOURCE.Champ2</pre></td></tr></table></pre>
</div><br />
Ainsi, il est permis de gérer plusieurs règles en une seule fois. Ce gain de temps d'écriture de code ainsi qu’une optimisation du processus maintiennent le principe ensembliste des SGBDR comme SQL Server.<br />
<br />
Ce principe de clauses particulières permet aussi de cibler certaines lignes afin de les supprimer.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0"> <span style="color: #0000ff;">WHEN</span> <span style="color: #0000ff;">MATCHED</span> <span style="color: #0000ff;">AND</span> Champ3 = <span style="color: #FF0000;">'DEL'</span> <span style="color: #0000ff;">THEN</span>
 <span style="color: #0000ff;">DELETE</span></pre></td></tr></table></pre>
</div><br />
<b><font color="#0000FF">Avantages du MERGE</font></b><br />
Cette fonctionnalité peut rapidement devenir essentielle lors de traitements de grosses volumétries. Les processus respectant les normes SQL sont optimisés et exploitent pleinement les possibilités des moteurs SGBD. Un MERGE bien maitrisé vous ouvrira les portes de procédures multi-tâches et efficaces !<br />
<br />
<b><font color="#0000FF">Cas Pratique</font></b><br />
	Observons comment se déroule une requête MERGE. Commençons par une structure de base :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">DATABASE</span> TrainningMERGE;
<span style="color: #0000ff;">GO</span>
<span style="color: #0000ff;">USE</span> TrainningMERGE;
<span style="color: #0000ff;">GO</span>
&nbsp;
<span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TABLE</span> dbo.TableMERGE<span class="br0">&#40;</span>
  Id <span style="color: #0000ff;">Int</span> <span style="color: #0000ff;">IDENTITY</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1</span> <span class="br0">&#41;</span>
, Nom <span style="color: #0000ff;">VarChar</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">50</span> <span class="br0">&#41;</span>
, Prenom <span style="color: #0000ff;">VarChar</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">50</span> <span class="br0">&#41;</span>
, TypeAction <span style="color: #0000ff;">CHAR</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">3</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">GO</span>
&nbsp;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TableMERGE<span class="br0">&#40;</span> Nom, Prenom, TypeAction <span class="br0">&#41;</span><span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'jean'</span>    , <span style="color: #FF0000;">'valjean'</span>, <span style="color: #FF0000;">'MAJ'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TableMERGE<span class="br0">&#40;</span> Nom, Prenom, TypeAction <span class="br0">&#41;</span><span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'pierre'</span>  , <span style="color: #FF0000;">'dupont'</span> , <span style="color: #FF0000;">'MAJ'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TableMERGE<span class="br0">&#40;</span> Nom, Prenom, TypeAction <span class="br0">&#41;</span><span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'capitain'</span>, <span style="color: #FF0000;">'haddock'</span>, <span style="color: #FF0000;">'MAJ'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TableMERGE<span class="br0">&#40;</span> Nom, Prenom, TypeAction <span class="br0">&#41;</span><span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'hamza'</span>   , <span style="color: #FF0000;">'hamzawi'</span>, <span style="color: #FF0000;">'MAJ'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TableMERGE<span class="br0">&#40;</span> Nom, Prenom, TypeAction <span class="br0">&#41;</span><span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'sarra'</span>   , <span style="color: #FF0000;">'alfane'</span> , <span style="color: #FF0000;">'MAJ'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TableMERGE<span class="br0">&#40;</span> Nom, Prenom, TypeAction <span class="br0">&#41;</span><span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'jean'</span>    , <span style="color: #FF0000;">'valjean'</span>, <span style="color: #FF0000;">'DEL'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TableMERGE<span class="br0">&#40;</span> Nom, Prenom, TypeAction <span class="br0">&#41;</span><span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'pierre'</span>  , <span style="color: #FF0000;">'dupont'</span> , <span style="color: #FF0000;">'DEL'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TableMERGE<span class="br0">&#40;</span> Nom, Prenom, TypeAction <span class="br0">&#41;</span><span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'capitain'</span>, <span style="color: #FF0000;">'haddock'</span>, <span style="color: #FF0000;">'DEL'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TableMERGE<span class="br0">&#40;</span> Nom, Prenom, TypeAction <span class="br0">&#41;</span><span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'hamza'</span>   , <span style="color: #FF0000;">'hamzawi'</span>, <span style="color: #FF0000;">'DEL'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TableMERGE<span class="br0">&#40;</span> Nom, Prenom, TypeAction <span class="br0">&#41;</span><span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'sarra'</span>   , <span style="color: #FF0000;">'alfane'</span> , <span style="color: #FF0000;">'DEL'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">GO</span></pre></td></tr></table></pre>
</div><br />
Ensuite, le MERGE. <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">--La requ&ecirc;te de la source met la premi&egrave;re lettre du Nom et du Pr&eacute;nom en capitale.</span>
<span style="color: #0000ff;">MERGE</span> <span style="color: #0000ff;">INTO</span> dbo.<span style="color: #0000ff;">Table</span> <span style="color: #0000ff;">MERGE</span> <span style="color: #0000ff;">AS</span> Target
<span style="color: #0000ff;">USING</span> <span class="br0">&#40;</span> <span style="color: #0000ff;">SELECT</span> Id,
               UPPER<span class="br0">&#40;</span> <span style="color: #0000ff;">LEFT</span><span class="br0">&#40;</span> Nom, <span style="color: #cc66cc;">1</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span> + <span style="color: #0000ff;">RIGHT</span><span class="br0">&#40;</span> Nom, <span style="color: #0000ff;">LEN</span><span class="br0">&#40;</span> Nom <span class="br0">&#41;</span> -<span style="color: #cc66cc;">1</span> <span class="br0">&#41;</span>          <span style="color: #0000ff;">AS</span> Nom   ,
               UPPER<span class="br0">&#40;</span> <span style="color: #0000ff;">LEFT</span><span class="br0">&#40;</span> Prenom, <span style="color: #cc66cc;">1</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span> + <span style="color: #0000ff;">RIGHT</span><span class="br0">&#40;</span> Prenom, <span style="color: #0000ff;">LEN</span><span class="br0">&#40;</span> Prenom <span class="br0">&#41;</span> -<span style="color: #cc66cc;">1</span> <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> Prenom
          <span style="color: #0000ff;">FROM</span> dbo.TableMERGE
         <span style="color: #0000ff;">UNION</span>
        <span style="color: #0000ff;">SELECT</span> <span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">'Isabelle'</span>, <span style="color: #FF0000;">'Hupert'</span> <span style="color: #0000ff;">UNION</span>
        <span style="color: #0000ff;">SELECT</span> <span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">'Hind'</span>    , <span style="color: #FF0000;">'Affane'</span> <span style="color: #0000ff;">UNION</span>
        <span style="color: #0000ff;">SELECT</span> <span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">'Baptiste'</span>, <span style="color: #FF0000;">'Durand'</span> <span style="color: #0000ff;">UNION</span>
        <span style="color: #0000ff;">SELECT</span> <span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">'Joseph'</span>  , <span style="color: #FF0000;">'Bardin'</span> <span style="color: #0000ff;">UNION</span>
        <span style="color: #0000ff;">SELECT</span> <span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">'Cl&eacute;ment'</span> , <span style="color: #FF0000;">'Grenier'</span><span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> Source
 <span style="color: #0000ff;">ON</span> Target.Id = Source.ID
 <span style="color: #0000ff;">WHEN</span> <span style="color: #0000ff;">MATCHED</span> <span style="color: #0000ff;">AND</span> Target.TypeAction = <span style="color: #FF0000;">'MAJ'</span> <span style="color: #0000ff;">THEN</span> <span style="color: #0000ff;">UPDATE</span>
 <span style="color: #0000ff;">SET</span> Nom        = Source.Nom
   , Prenom     = Source.Prenom
   , TypeAction = <span style="color: #FF0000;">'TER'</span> <span style="color: #808080;">--Comme Termin&eacute;</span>
 <span style="color: #0000ff;">WHEN</span> <span style="color: #0000ff;">MATCHED</span> <span style="color: #0000ff;">AND</span> Target.TypeAction = <span style="color: #FF0000;">'DEL'</span> <span style="color: #0000ff;">THEN</span>
 <span style="color: #0000ff;">DELETE</span>
 <span style="color: #0000ff;">WHEN</span> <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">MATCHED</span> <span style="color: #0000ff;">THEN</span>
 <span style="color: #0000ff;">INSERT</span> <span class="br0">&#40;</span>        Nom,        Prenom, TypeAction <span class="br0">&#41;</span>
 <span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span> Source.Nom, Source.Prenom,      <span style="color: #FF0000;">'INS'</span> <span class="br0">&#41;</span>
 ;</pre></td></tr></table></pre>
</div><br />
Nb : Un MERGE doit impérativement se terminer par un &quot;;&quot; sinon SQL Server déclare une erreur.<br />
<br />
Ici, notre but est de mettre la première lettre des Noms/Prénom en Majuscule, de supprimer les lignes en double et d’insérer de nouvelles personnes dans la table !<br />
Pour faciliter la lecture, les marqueurs sont volontairement simples. ‘DEL’ pour des données à supprimer ‘MAJ’ pour les données à mettre à jour, les UNION dans la requête source ajoutent les données non-existantes dans la table.<br />
Vous pouvez constater avec un SELECT de la table qu’il y a bien 10 lignes, les 5 premières avec des majuscules en première lettre, une action = ‘TER’ et de nouvelles lignes avec une action à ‘INS’.<br />
Les autres lignes, celles avec l’action ‘DEL’, ont été supprimées !<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p208519d1462204284/autres-langages/pascal/turbo-pascal/tp-lire-ligne-l-ecran-stocker-chaine/merge-1er-.jpg/" border="0" alt="Nom : MERGE - 1er essai.jpg
Affichages : 844
Taille : 38,7 Ko"  style="float: CONFIG" /></div><br />
<b><font color="#0000FF">La Clause OUTPUT</font></b><br />
<br />
Nous venons de voir les fonctionnalités de base du MERGE, à savoir représenter en une seule grande fonction, le principe de base des SGBDR : manager les données dans les tables. Cependant, certains projets nécessitent un peu plus que de simples INSERT, DELETE et UPDATE. Il  faut parfois faire des historisations des données en conservant toutes les traces d’évolution de celles-ci. Chaque modification ou suppression doit être enregistrée, datée et caractérisée. Afin de simplifier ce genre de processus, les triggers, bien que consommateurs de ressources, sont utiles. Ils permettent de travailler via des tables de session (INSERTED, DELETED). Cependant, SQL Server a implanté une fonctionnalité très pratique, la clause OUTPUT. Elle permet d’extraire d’une requête les données qui ont été calculées ou mises en forme. Qu’est-ce que ça signifie ? Simplement qu’une requête, à laquelle on ajoute cette clause, présente les données qu’elle vient de traiter pour les envoyer dans une autre table.<br />
<br />
Voici l’exemple d’un SELECT INSERT qui déverse les données traitées dans une table clone qui permet, par exemple, de traiter en arrière-plan de grosses volumétries, tout en laissant la table courante libre de tout verrouillage.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> <span style="color: black;">[schema]</span>.<span style="color: black;">[maTable]</span>
<span style="color: #0000ff;">SELECT</span> *
<span style="color: #0000ff;">OUTPUT</span> INSERTED.*
  <span style="color: #0000ff;">INTO</span> <span style="color: black;">[schema]</span>.<span style="color: black;">[maTable3]</span>
  <span style="color: #0000ff;">FROM</span> <span style="color: black;">[schema]</span>.<span style="color: black;">[maTable2]</span>;</pre></td></tr></table></pre>
</div><br />
Cette clause peut aussi être placée dans un UPDATE.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:120px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">UPDATE</span> <span style="color: black;">[schema]</span>.<span style="color: black;">[maTable]</span>
   <span style="color: #0000ff;">SET</span> Champ1 = <span style="color: black;">[s]</span>.<span style="color: black;">[Champ1]</span>
     , Champ2 = <span style="color: black;">[s]</span>.<span style="color: black;">[Champ2]</span>
<span style="color: #0000ff;">OUTPUT</span> DELETED.*, GETDATE
  <span style="color: #0000ff;">INTO</span> <span style="color: black;">[schema]</span>.<span style="color: black;">[maTable_HST]</span>
  <span style="color: #0000ff;">FROM</span> <span style="color: black;">[schema]</span>.<span style="color: black;">[maTable2]</span> <span style="color: #0000ff;">AS</span> <span style="color: black;">[s]</span>
 <span style="color: #0000ff;">WHERE</span> <span style="color: black;">[schema]</span>.<span style="color: black;">[maTable]</span>.Cl&eacute; = <span style="color: black;">[s]</span>.Cl&eacute;;</pre></td></tr></table></pre>
</div><br />
Ici, la clause OUTPUT extrait les données de [schema].[maTable] avant modification et les exporte dans une table d’historique, clone de la table mise à jour et possédant une colonne de date d’historisation. Cette façon d’historiser permet de manager de façon efficace, l’ensemble des données impactées par un traitement. Évidemment tout ceci a un coût, mais reste moindre par rapport à l'utilisation de 2 requêtes 1 première qui va sauvegarder les données et une 2ème pour traiter les nouvelles.<br />
<br />
Ceci peut aussi s’appliquer à une clause DELETE.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">DELETE</span>
<span style="color: #0000ff;">OUTPUT</span> DELETED.*, GETDATE<span class="br0">&#40;</span><span class="br0">&#41;</span>
  <span style="color: #0000ff;">INTO</span> <span style="color: black;">[schema]</span>.<span style="color: black;">[maTable_HST]</span>
  <span style="color: #0000ff;">FROM</span> <span style="color: black;">[schema]</span>.<span style="color: black;">[maTable]</span>;</pre></td></tr></table></pre>
</div><br />
Dans ce cas, les données supprimées de la table sont aussi historisées.<br />
<br />
<b><font color="#0000FF">Clause OUTPUT et MERGE</font></b><br />
<br />
Cette fonctionnalité, très utile, a aussi été implémentée avec un MERGE. L’avantage réside dans le fait de pouvoir manager chacune des actions entreprises sur la table en précisant l'action appliquée.<br />
Cependant, la forme diffère un peu. La structure d’un MERGE étant totalement différente des 3 exemples ci-dessus, il est important de noter, qu’une clause OUTPUT dans un MERGE, n’est pas simplement composée de 2 lignes, mais permet cependant plus de souplesse quant aux données historisées.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> <span style="color: black;">[schema]</span>.<span style="color: black;">[table_HST]</span>
<span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> <span class="br0">&#40;</span>
&nbsp;
<span style="color: #0000ff;">MERGE</span> <span style="color: #0000ff;">INTO</span> <span style="color: black;">[schema]</span>.<span style="color: black;">[table]</span> <span style="color: #0000ff;">AS</span> TARGET
<span style="color: #0000ff;">USING</span> <span class="br0">&#40;</span> <span style="color: #0000ff;">SELECT</span> *
          <span style="color: #0000ff;">FROM</span> maSource <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> SOURCE <span style="color: #0000ff;">ON</span> TARGET.Cl&eacute; = SOURCE.Cl&eacute;
<span style="color: #0000ff;">WHEN</span> <span style="color: #0000ff;">MATCHED</span> <span style="color: #0000ff;">THEN</span> <span style="color: #0000ff;">UPDATE</span>
  <span style="color: #0000ff;">SET</span> Champ1 = SOURCE.Champ1
    , Champ2 = SOURCE.Champ2
 <span style="color: #0000ff;">WHEN</span> <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">MATCHED</span> <span style="color: #0000ff;">THEN</span>
<span style="color: #0000ff;">INSERT</span> <span class="br0">&#40;</span>        Champ1,        Champ2,        Champ3 <span class="br0">&#41;</span>
<span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span> SOURCE.Champ1, SOURCE.Champ2, SOURCE.Champ3 <span class="br0">&#41;</span>
<span style="color: #0000ff;">OUTPUT</span> DELETED.*, GETDATE<span class="br0">&#40;</span><span class="br0">&#41;</span>, $Action
&nbsp;
<span class="br0">&#41;</span> MERGE_Out<span class="br0">&#40;</span>Champ1, Champ2, Champ3, Date_Traitement, Actions<span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
Comme vous pouvez le constater, l’OUTPUT du MERGE est en fait une encapsulation de ce dernier dans un INSERT SELECT. On va considérer le jeu de données ressorties par le MERGE comme une requête source (ou table dérivée) et s’en servir dans un SELECT. Il est alors possible d’effectuer divers traitements, comme des filtres sur les actions effectuées.<br />
Nb : La fonction $Action liée à une clause OUTPUT indique l'action effectuée par le MERGE sur la ligne en question.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;"><span style="color: #0000ff;">WHERE</span> Actions <span style="color: #0000ff;">IN</span> <span class="br0">&#40;</span> <span style="color: #FF0000;">'UPDATE'</span>, <span style="color: #FF0000;">'DELETE'</span> <span class="br0">&#41;</span></pre>
</div><br />
Dans ce cas, seules les données mises à jour et supprimées sont historiées. Cependant, il serait tout aussi possible d’utiliser la table INSERTED, ou SOURCE dans le OUTPUT pour ressortir les nouvelles données et les historiser. Tout dépend de votre projet.<br />
<br />
<b><font color="#0000FF">Cas Pratique</font></b><br />
<br />
Nous avons vu un peu plus haut un MERGE classique. Maintenant, mettons en application ce que nous venons d’aborder.<br />
Avant tout, créons une structure capable de recevoir nos données ! Puis, supprimons les données de notre table d’origine et réinsérons-les.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TABLE</span> dbo.TableMERGE_HISTO<span class="br0">&#40;</span>
  Id <span style="color: #0000ff;">Int</span>
, Nom <span style="color: #0000ff;">VarChar</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">50</span> <span class="br0">&#41;</span>
, Prenom <span style="color: #0000ff;">VarChar</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">50</span> <span class="br0">&#41;</span>
, TypeAction <span style="color: #0000ff;">CHAR</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">3</span> <span class="br0">&#41;</span>
, DateHisto DateTimeOffset<span class="br0">&#40;</span> <span style="color: #cc66cc;">5</span> <span class="br0">&#41;</span>
, ActionHisto <span style="color: #0000ff;">VarChar</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">10</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span>;
<span style="color: #808080;">--La requ&ecirc;te de la source met la premi&egrave;re lettre du Nom et du Prenom en capital.</span>
&nbsp;
<span style="color: #0000ff;">TRUNCATE</span> <span style="color: #0000ff;">TABLE</span> dbo.TableMERGE; <span style="color: #808080;">--Pour repartir sur un jeu de donn&eacute;es vierge, un truncate de la table puis une insertion des donn&eacute;es est a faire</span>
<span style="color: #0000ff;">GO</span>
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TableMERGE<span class="br0">&#40;</span> Nom, Prenom, TypeAction <span class="br0">&#41;</span><span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'jean'</span>    , <span style="color: #FF0000;">'valjean'</span>, <span style="color: #FF0000;">'MAJ'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TableMERGE<span class="br0">&#40;</span> Nom, Prenom, TypeAction <span class="br0">&#41;</span><span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'pierre'</span>  , <span style="color: #FF0000;">'dupont'</span> , <span style="color: #FF0000;">'MAJ'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TableMERGE<span class="br0">&#40;</span> Nom, Prenom, TypeAction <span class="br0">&#41;</span><span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'capitain'</span>, <span style="color: #FF0000;">'haddock'</span>, <span style="color: #FF0000;">'MAJ'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TableMERGE<span class="br0">&#40;</span> Nom, Prenom, TypeAction <span class="br0">&#41;</span><span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'hamza'</span>   , <span style="color: #FF0000;">'hamzawi'</span>, <span style="color: #FF0000;">'MAJ'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TableMERGE<span class="br0">&#40;</span> Nom, Prenom, TypeAction <span class="br0">&#41;</span><span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'sarra'</span>   , <span style="color: #FF0000;">'alfane'</span> , <span style="color: #FF0000;">'MAJ'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TableMERGE<span class="br0">&#40;</span> Nom, Prenom, TypeAction <span class="br0">&#41;</span><span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'jean'</span>    , <span style="color: #FF0000;">'valjean'</span>, <span style="color: #FF0000;">'DEL'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TableMERGE<span class="br0">&#40;</span> Nom, Prenom, TypeAction <span class="br0">&#41;</span><span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'pierre'</span>  , <span style="color: #FF0000;">'dupont'</span> , <span style="color: #FF0000;">'DEL'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TableMERGE<span class="br0">&#40;</span> Nom, Prenom, TypeAction <span class="br0">&#41;</span><span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'capitain'</span>, <span style="color: #FF0000;">'haddock'</span>, <span style="color: #FF0000;">'DEL'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TableMERGE<span class="br0">&#40;</span> Nom, Prenom, TypeAction <span class="br0">&#41;</span><span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'hamza'</span>   , <span style="color: #FF0000;">'hamzawi'</span>, <span style="color: #FF0000;">'DEL'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TableMERGE<span class="br0">&#40;</span> Nom, Prenom, TypeAction <span class="br0">&#41;</span><span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'sarra'</span>   , <span style="color: #FF0000;">'alfane'</span> , <span style="color: #FF0000;">'DEL'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">GO</span></pre></td></tr></table></pre>
</div><br />
Maintenant, voyons comment, à partir de la requête MERGE du dessus, nous pouvons supprimer, et mettre à jour, tout en conservant l’information des données que nous avons touchées dans une table. Le tout, en une seule et unique requête ! (après tout, nous sommes là pour ça !)<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TableMERGE_HISTO<span class="br0">&#40;</span> Id, Nom, Prenom, TypeAction, DateHisto, ActionHisto <span class="br0">&#41;</span>
<span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> <span class="br0">&#40;</span>
<span style="color: #0000ff;">MERGE</span> <span style="color: #0000ff;">INTO</span> dbo.TableMERGE <span style="color: #0000ff;">AS</span> Target
<span style="color: #0000ff;">USING</span> <span class="br0">&#40;</span> <span style="color: #0000ff;">SELECT</span> Id,
               UPPER<span class="br0">&#40;</span> <span style="color: #0000ff;">LEFT</span><span class="br0">&#40;</span> Nom, <span style="color: #cc66cc;">1</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span> + <span style="color: #0000ff;">RIGHT</span><span class="br0">&#40;</span> Nom, <span style="color: #0000ff;">LEN</span><span class="br0">&#40;</span> Nom <span class="br0">&#41;</span> -<span style="color: #cc66cc;">1</span> <span class="br0">&#41;</span>          <span style="color: #0000ff;">AS</span> Nom   ,
               UPPER<span class="br0">&#40;</span> <span style="color: #0000ff;">LEFT</span><span class="br0">&#40;</span> Prenom, <span style="color: #cc66cc;">1</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span> + <span style="color: #0000ff;">RIGHT</span><span class="br0">&#40;</span> Prenom, <span style="color: #0000ff;">LEN</span><span class="br0">&#40;</span> Prenom <span class="br0">&#41;</span> -<span style="color: #cc66cc;">1</span> <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> Prenom
          <span style="color: #0000ff;">FROM</span> dbo.TableMERGE
         <span style="color: #0000ff;">UNION</span>
        <span style="color: #0000ff;">SELECT</span> <span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">'Isabelle'</span>, <span style="color: #FF0000;">'Hupert'</span> <span style="color: #0000ff;">UNION</span>
        <span style="color: #0000ff;">SELECT</span> <span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">'Hind'</span>    , <span style="color: #FF0000;">'Affane'</span> <span style="color: #0000ff;">UNION</span>
        <span style="color: #0000ff;">SELECT</span> <span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">'Baptiste'</span>, <span style="color: #FF0000;">'Durand'</span> <span style="color: #0000ff;">UNION</span>
        <span style="color: #0000ff;">SELECT</span> <span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">'Joseph'</span>  , <span style="color: #FF0000;">'Bardin'</span> <span style="color: #0000ff;">UNION</span>
        <span style="color: #0000ff;">SELECT</span> <span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">'Cl&eacute;ment'</span> , <span style="color: #FF0000;">'Grenier'</span><span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> Source
 <span style="color: #0000ff;">ON</span> Target.Id = Source.ID
 <span style="color: #0000ff;">WHEN</span> <span style="color: #0000ff;">MATCHED</span> <span style="color: #0000ff;">AND</span> Target.TypeAction = <span style="color: #FF0000;">'MAJ'</span> <span style="color: #0000ff;">THEN</span> <span style="color: #0000ff;">UPDATE</span>
 <span style="color: #0000ff;">SET</span> Nom        = Source.Nom
   , Prenom     = Source.Prenom
   , TypeAction = <span style="color: #FF0000;">'TER'</span> <span style="color: #808080;">--Comme Termin&eacute;</span>
 <span style="color: #0000ff;">WHEN</span> <span style="color: #0000ff;">MATCHED</span> <span style="color: #0000ff;">AND</span> Target.TypeAction = <span style="color: #FF0000;">'DEL'</span> <span style="color: #0000ff;">THEN</span>
 <span style="color: #0000ff;">DELETE</span>
 <span style="color: #0000ff;">WHEN</span> <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">MATCHED</span> <span style="color: #0000ff;">THEN</span>
 <span style="color: #0000ff;">INSERT</span> <span class="br0">&#40;</span>        Nom,        Prenom, TypeAction <span class="br0">&#41;</span>
 <span style="color: #0000ff;">VALUES</span> <span class="br0">&#40;</span> Source.Nom, Source.Prenom,      <span style="color: #FF0000;">'INS'</span> <span class="br0">&#41;</span>
 <span style="color: #0000ff;">OUTPUT</span> DELETED.*, GETUTCDATE<span class="br0">&#40;</span><span class="br0">&#41;</span>, $Action
 <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> Output_MERGE <span class="br0">&#40;</span> Id, Nom, Prenom, TypeAction, DateHisto, Actions <span class="br0">&#41;</span>
 <span style="color: #0000ff;">WHERE</span> Actions <span style="color: #0000ff;">IN</span> <span class="br0">&#40;</span> <span style="color: #FF0000;">'DELETE'</span>, <span style="color: #FF0000;">'UPDATE'</span> <span class="br0">&#41;</span>
 ;</pre></td></tr></table></pre>
</div><br />
Faites maintenant, un SELECT sur votre table d’historique ainsi que sur votre table mise à jour. Le résultat est le même pour la table d’origine, mais vous pourrez constater dans la table d’historique que les lignes supprimées sont là, et que les lignes mises à jour sont là avec la valeur présente dans la table AVANT la mise à jour.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">SELECT</span> *
   <span style="color: #0000ff;">FROM</span> dbo.TableMERGE_HISTO</pre></td></tr></table></pre>
</div><br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p208520d1462204936/autres-langages/pascal/turbo-pascal/tp-lire-ligne-l-ecran-stocker-chaine/merge-table-histo.jpg/" border="0" alt="Nom : MERGE - Table histo.jpg
Affichages : 895
Taille : 93,8 Ko"  style="float: CONFIG" /></div><br />
Ainsi, voici comment gérer une table tout en conservant les données que nous avons modifiées.<br />
<br />
<b><font color="#0000FF">Conclusion</font></b><br />
	SQL est un moyen de traiter de façon efficace de grosses volumétries de données sans systématiquement nécessiter d'énormes capacités de calcul.<br />
<br />
	Toutefois, l’utilisation d’un OUTPUT nécessite une vérification des volumétries des bases. En effet, gérer un historique complet des mouvements d’une table peut poser des problèmes de stockage, pouvant entraîner des coûts considérables.<br />
Dans un projet BI, cette problématique est récurrente et il est essentiel de bien réfléchir à la façon dont l’historisation des tables sera gérée : TRIGGER, ETL ou fonction MERGE.<br />
Bons projets à vous.</blockquote>

]]></content:encoded>
			<dc:creator>Lyche</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/135170-lyche/b1330/l-historisation-donnees-via-fonction-merge/</guid>
		</item>
		<item>
			<title>L’agrégation de données</title>
			<link>https://www.developpez.net/forums/blogs/135170-lyche/b1329/l-agregation-donnees/</link>
			<pubDate>Tue, 26 Apr 2016 12:59:34 GMT</pubDate>
			<description>*Fonction de totaux et...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><font color="#0000FF"><br />
</font><b><div style="text-align: center;"><font color="#0000FF">Fonction de totaux et sous-totaux</font></div></b><br />
<br />
<font color="#0000FF"> <br />
</font><b><font color="#0000FF">Présentation</font></b><br />
<br />
               Les bases de données de Business Intelligence sont confrontées à  des problématiques récurrentes de calculs, de statistiques, ou de diverses agrégations de données. Beaucoup s’imaginent que faire des sommes et autres moyennes de notes n’est qu’appliquer de simples formules mathématiques. Or, lorsqu’il s’agit de bases de données, ces calculs prennent une autre dimension, dont la complexité dépend des règles de gestion et du besoin client.<br />
 <br />
<b><font color="#0000FF">Les Agrégations</font></b><br />
<br />
Les agrégations, malgré ce nom un peu effrayant, sont de simples calculs mathématiques. Le tableau, ci-dessous, présente les fonctions d’agrégation les plus communes.<br />
<br />
<div class="cms_table"><table width="363" class="cms_table_grid" align="center"><tr valign="top" class="cms_table_grid_tr"><TD class="cms_table_grid_td"><b>Fonction</b></TD>
<TD class="cms_table_grid_td"><b>Sert à</b></TD>
</tr>
<tr valign="top" class="cms_table_grid_tr"><TD class="cms_table_grid_td">AVG()</TD>
<TD class="cms_table_grid_td">Calculer la moyenne des valeurs agrégées</TD>
</tr>
<tr valign="top" class="cms_table_grid_tr"><TD class="cms_table_grid_td">COUNT()</TD>
<TD class="cms_table_grid_td">Calculer le nombre de lignes</TD>
</tr>
<tr valign="top" class="cms_table_grid_tr"><TD class="cms_table_grid_td">MAX()</TD>
<TD class="cms_table_grid_td">Récupérer la valeur maximum d'une colonne</TD>
</tr>
<tr valign="top" class="cms_table_grid_tr"><TD class="cms_table_grid_td">MIN()</TD>
<TD class="cms_table_grid_td">Récupérer la valeur minimum d'une colonne</TD>
</tr>
<tr valign="top" class="cms_table_grid_tr"><TD class="cms_table_grid_td">SUM()</TD>
<TD class="cms_table_grid_td">Calculer la somme des valeurs de la colonne</TD>
</tr>
</table></div>
<br />
<br />
<b><font color="#0000FF">Cas pratique</font></b><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:192px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br /></div></td><td valign="top"><pre style="margin: 0">;<span style="color: #0000ff;">WITH</span> ListUsers <span style="color: #0000ff;">AS</span> <span class="br0">&#40;</span>
<span style="color: #0000ff;">SELECT</span> *
  <span style="color: #0000ff;">FROM</span> <span class="br0">&#40;</span> <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">1</span>, <span style="color: #FF0000;">'Georges'</span>, <span style="color: #cc66cc;">74</span> <span class="br0">&#41;</span>,
               <span class="br0">&#40;</span> <span style="color: #cc66cc;">2</span>, <span style="color: #FF0000;">'Pierre'</span> , <span style="color: #cc66cc;">17</span> <span class="br0">&#41;</span>,
               <span class="br0">&#40;</span> <span style="color: #cc66cc;">3</span>, <span style="color: #FF0000;">'Bernard'</span>, <span style="color: #cc66cc;">63</span> <span class="br0">&#41;</span>,
               <span class="br0">&#40;</span> <span style="color: #cc66cc;">4</span>, <span style="color: #FF0000;">'John'</span>   , <span style="color: #cc66cc;">23</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> Users<span class="br0">&#40;</span> Id, Nom, Age <span class="br0">&#41;</span> <span class="br0">&#41;</span>
&nbsp;
<span style="color: #0000ff;">SELECT</span> <span style="color: #0000ff;">SUM</span><span class="br0">&#40;</span> Age <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> <span style="color: black;">[Somme_Age]</span>
     , AVG<span class="br0">&#40;</span> Age <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> <span style="color: black;">[Moyenne_Age]</span>
     , MIN<span class="br0">&#40;</span> Age <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> <span style="color: black;">[Age_Minimum]</span>
     , MAX<span class="br0">&#40;</span> Age <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> <span style="color: black;">[Age_Maximum]</span>
     , COUNT<span class="br0">&#40;</span> * <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> <span style="color: black;">[Nombre_Users]</span>
  <span style="color: #0000ff;">FROM</span> ListUsers</pre></td></tr></table></pre>
</div><div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p207957d1461671659/autres-langages/pascal/turbo-pascal/tp-lire-ligne-l-ecran-stocker-chaine/exemple1.jpg/" border="0" alt="Nom : Exemple1.jpg
Affichages : 18404
Taille : 9,2 Ko"  style="float: CONFIG" /></div>Cet exemple utilise un jeu de données assez simple : une liste de personnes avec leur âge, sur lequel sont faits les différents calculs requis. En premier, la somme des âges, ensuite la moyenne d’âge, puis le plus jeune, le plus vieux et enfin le nombre de lignes dans notre jeu de données.<br />
<b><font color="#0000FF">GROUP BY</font></b><br />
<br />
Ces  fonctionnalités ne sont pas difficiles à comprendre. Ce qui peut compliquer la tâche, c’est la difficulté d’associer un certain nombre de colonnes à des calculs spécifiques. Ce que l’on nommera le groupement de données, (GROUP BY en langage SQL)<br />
Cette fonctionnalité de la norme SQL permet de définir des éléments communs de regroupement de l’information.<br />
Avant de rentrer dans le texte un peu théorique, pas toujours clair et parfois difficile à comprendre, un petit cas pratique.<br />
<b><font color="#0000FF">Cas pratique</font></b><br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TABLE</span> dbo.TB_DEPARTEMENTS <span class="br0">&#40;</span>
  ID_DEPARTEMENT  <span style="color: #0000ff;">INT</span> <span style="color: #0000ff;">PRIMARY</span> <span style="color: #0000ff;">KEY</span>
, NOM_DEPARTEMENT <span style="color: #0000ff;">VARCHAR</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">50</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">GO</span>
&nbsp;
<span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TABLE</span> dbo.TB_EMPLOYES <span class="br0">&#40;</span>
  ID_EMPLOYE      <span style="color: #0000ff;">INT</span> <span style="color: #0000ff;">PRIMARY</span> <span style="color: #0000ff;">KEY</span>
, NOM_EMPLOYE     <span style="color: #0000ff;">VARCHAR</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">50</span> <span class="br0">&#41;</span> <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULL</span>
, AGE_EMPLOYE     <span style="color: #0000ff;">INT</span>
, DEPARTEMENT_ID  <span style="color: #0000ff;">INT</span>
, SALAIRE_EMPLOYE MONEY <span class="br0">&#41;</span>;
<span style="color: #0000ff;">GO</span>
&nbsp;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_DEPARTEMENTS
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">1</span>, <span style="color: #FF0000;">'Administration'</span>       <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_DEPARTEMENTS
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">2</span>, <span style="color: #FF0000;">'Ressources Humaines'</span>  <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_DEPARTEMENTS
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">3</span>, <span style="color: #FF0000;">'Service Informatique'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_DEPARTEMENTS
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">4</span>, <span style="color: #FF0000;">'Comptabilit&eacute;'</span>         <span class="br0">&#41;</span>;
&nbsp;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_EMPLOYES
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">1</span>, <span style="color: #FF0000;">'Georges'</span>, <span style="color: #cc66cc;">74</span>, <span style="color: #cc66cc;">4</span>, <span style="color: #cc66cc;">2480.3</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_EMPLOYES
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">2</span>, <span style="color: #FF0000;">'Pierre'</span> , <span style="color: #cc66cc;">17</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">1387.2</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_EMPLOYES
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">3</span>, <span style="color: #FF0000;">'Bernard'</span>, <span style="color: #cc66cc;">63</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">3499.8</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_EMPLOYES
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">4</span>, <span style="color: #FF0000;">'John'</span>   , <span style="color: #cc66cc;">23</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">1876.9</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_EMPLOYES
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">5</span>, <span style="color: #FF0000;">'J&eacute;rome'</span> , <span style="color: #cc66cc;">45</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">2286.6</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_EMPLOYES
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">6</span>, <span style="color: #FF0000;">'Lina'</span>, <span style="color: #cc66cc;">30</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">2230.4</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_EMPLOYES
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">7</span>, <span style="color: #FF0000;">'Marie'</span>, <span style="color: #cc66cc;">26</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">1980.4</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_EMPLOYES
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">8</span>, <span style="color: #FF0000;">'Virginie'</span>, <span style="color: #cc66cc;">37</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">2730.4</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.TB_EMPLOYES
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">9</span>, <span style="color: #FF0000;">'H&eacute;l&egrave;ne'</span>, <span style="color: #cc66cc;">33</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">2430.4</span> <span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div> Les commandes ci-dessus créent 2 tables employés/départements liées par l’id_departement.<br />
Nous sommes ici dans le cadre d’une entreprise qui va vouloir faire quelques statistiques sur ses employés.<br />
<b><font color="#0000FF">1 – Faire la somme des salaires par département.</font></b><br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">SELECT</span> NOM_DEPARTEMENT
     , <span style="color: #0000ff;">SUM</span><span class="br0">&#40;</span> SALAIRE_EMPLOYE <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> TOTAL_SALAIRE
  <span style="color: #0000ff;">FROM</span> dbo.TB_EMPLOYES E
       <span style="color: #0000ff;">INNER</span> <span style="color: #0000ff;">JOIN</span> dbo.TB_DEPARTEMENTS D <span style="color: #0000ff;">ON</span> E.DEPARTEMENT_ID = D.ID_DEPARTEMENT
 <span style="color: #0000ff;">GROUP</span> <span style="color: #0000ff;">BY</span> NOM_DEPARTEMENT</pre></td></tr></table></pre>
</div><div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p207958d1461671879/autres-langages/pascal/turbo-pascal/tp-lire-ligne-l-ecran-stocker-chaine/exemple2.jpg/" border="0" alt="Nom : Exemple2.jpg
Affichages : 10492
Taille : 16,3 Ko"  style="float: CONFIG" /></div>Vous pourrez remarquer l’emploi de la fonction GROUP BY, associée à la colonne NOM_DEPARTEMENT.<br />
Vous constaterez que la valeur de la colonne TOTAL_SALAIRE est égale à la somme totale des salaires saisis pour la liste des employés.<br />
<b><font color="#0000FF">Explication</font></b><br />
<br />
Au niveau du SGBD, la commande lui ordonne de sommer la colonne salaire et de faire ce calcul par nom de département (donc, de regrouper les informations identiques en une seule ligne).<br />
Nous nous retrouvons donc avec nos 4 départements et leur budget mensuel respectifs.<br />
 Nous pourrions faire exactement les mêmes calculs que dans la première partie de notre billet.<br />
<b><font color="#0000FF">2 – Calculer la moyenne des salaires, le salaire minimum et maximum, ainsi que le nombre d’employés par département       <br />
</font></b><br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:144px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">SELECT</span> NOM_DEPARTEMENT
     , <span style="color: #0000ff;">SUM</span><span class="br0">&#40;</span> SALAIRE_EMPLOYE <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> TOTAL_SALAIRE
     , AVG<span class="br0">&#40;</span> SALAIRE_EMPLOYE <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> MOYENNE_SALAIRE
     , MAX<span class="br0">&#40;</span> SALAIRE_EMPLOYE <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> SALAIRE_MAXIMUM
     , MIN<span class="br0">&#40;</span> SALAIRE_EMPLOYE <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> SALAIRE_MINIMUM
     , COUNT<span class="br0">&#40;</span> * <span class="br0">&#41;</span>             <span style="color: #0000ff;">AS</span> TOTAL_EMPLOYE
  <span style="color: #0000ff;">FROM</span> dbo.TB_EMPLOYES E
       <span style="color: #0000ff;">INNER</span> <span style="color: #0000ff;">JOIN</span> dbo.TB_DEPARTEMENTS D <span style="color: #0000ff;">ON</span> E.DEPARTEMENT_ID = D.ID_DEPARTEMENT
 <span style="color: #0000ff;">GROUP</span> <span style="color: #0000ff;">BY</span> NOM_DEPARTEMENT</pre></td></tr></table></pre>
</div> <br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p207959d1461672447/autres-langages/pascal/turbo-pascal/tp-lire-ligne-l-ecran-stocker-chaine/exemple3.jpg/" border="0" alt="Nom : Exemple3.jpg
Affichages : 10462
Taille : 24,9 Ko"  style="float: CONFIG" /></div>Ici, en étudiant, on constate certains écarts, notamment au niveau du service informatique là où il y a plusieurs employés.<br />
<br />
<ul><li style="">La requête permet ici de calculer plusieurs types d’informations basées sur le NOM_DEPARTEMENT comme critère commun. </li></ul><br />
 <br />
<br />
<font color="#FF0000"><b><u>Important :</u></b></font><br />
               Il m’est souvent arrivé d’avoir des demandes concernant des requêtes « fausses » à cause d’une mauvaise gestion du GROUP BY. Pour faire au plus simple quant à sa pratique, il faut savoir que toute colonne se trouvant dans un select et n’appartenant pas à une fonction d’agrégation, doit se retrouver dans la clause du GROUP BY.<br />
               Ce qui est le plus difficile, c’est l’identification des champs du select hors agrégat. Il est parfois nécessaire de retourner la question posée (ou la RG) afin d’être le plus précis possible sur les champs.<br />
<br />
<ul><li style="">À noter qu’il est possible d’agréger des données sur le résultat d’une fonction. </li></ul><br />
<b><font color="#0000FF">Exemple</font></b><br />
<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TABLE</span> dbo.INTERVENTION_CLIENT <span class="br0">&#40;</span>
  ID_INTERVENTION   <span style="color: #0000ff;">INT</span> <span style="color: #0000ff;">PRIMARY</span> <span style="color: #0000ff;">KEY</span>
, DATE_INTERVENTION <span style="color: #0000ff;">Date</span>
, NOM_CLIENT        <span style="color: #0000ff;">VARCHAR</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">50</span> <span class="br0">&#41;</span>
, EMPLOYE_ID        <span style="color: #0000ff;">INT</span>
, FACTURATION       Money <span class="br0">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span>  <span style="color: #cc66cc;">1</span>, <span style="color: #FF0000;">'2014-01-02'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">500</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span>  <span style="color: #cc66cc;">2</span>, <span style="color: #FF0000;">'2014-01-03'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span>  <span style="color: #cc66cc;">3</span>, <span style="color: #FF0000;">'2014-01-06'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span>  <span style="color: #cc66cc;">4</span>, <span style="color: #FF0000;">'2014-01-07'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span>  <span style="color: #cc66cc;">5</span>, <span style="color: #FF0000;">'2014-01-08'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span>  <span style="color: #cc66cc;">6</span>, <span style="color: #FF0000;">'2014-01-09'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span>  <span style="color: #cc66cc;">7</span>, <span style="color: #FF0000;">'2014-01-10'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span>  <span style="color: #cc66cc;">8</span>, <span style="color: #FF0000;">'2014-01-03'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">4</span>, <span style="color: #cc66cc;">400</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span>  <span style="color: #cc66cc;">9</span>, <span style="color: #FF0000;">'2014-01-04'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">4</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">10</span>, <span style="color: #FF0000;">'2014-01-06'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">4</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">11</span>, <span style="color: #FF0000;">'2014-01-07'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">4</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">12</span>, <span style="color: #FF0000;">'2014-01-08'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">4</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">13</span>, <span style="color: #FF0000;">'2014-01-03'</span>, <span style="color: #FF0000;">'Client 2'</span>, <span style="color: #cc66cc;">6</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">14</span>, <span style="color: #FF0000;">'2014-01-04'</span>, <span style="color: #FF0000;">'Client 2'</span>, <span style="color: #cc66cc;">6</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">15</span>, <span style="color: #FF0000;">'2014-01-06'</span>, <span style="color: #FF0000;">'Client 2'</span>, <span style="color: #cc66cc;">6</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">16</span>, <span style="color: #FF0000;">'2014-01-07'</span>, <span style="color: #FF0000;">'Client 2'</span>, <span style="color: #cc66cc;">6</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">17</span>, <span style="color: #FF0000;">'2014-01-08'</span>, <span style="color: #FF0000;">'Client 2'</span>, <span style="color: #cc66cc;">6</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">18</span>, <span style="color: #FF0000;">'2014-01-09'</span>, <span style="color: #FF0000;">'Client 2'</span>, <span style="color: #cc66cc;">6</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">19</span>, <span style="color: #FF0000;">'2014-01-10'</span>, <span style="color: #FF0000;">'Client 2'</span>, <span style="color: #cc66cc;">6</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">20</span>, <span style="color: #FF0000;">'2014-01-06'</span>, <span style="color: #FF0000;">'Client 3'</span>, <span style="color: #cc66cc;">7</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">21</span>, <span style="color: #FF0000;">'2014-01-07'</span>, <span style="color: #FF0000;">'Client 3'</span>, <span style="color: #cc66cc;">7</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">22</span>, <span style="color: #FF0000;">'2014-01-08'</span>, <span style="color: #FF0000;">'Client 3'</span>, <span style="color: #cc66cc;">7</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">23</span>, <span style="color: #FF0000;">'2014-01-09'</span>, <span style="color: #FF0000;">'Client 3'</span>, <span style="color: #cc66cc;">7</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">24</span>, <span style="color: #FF0000;">'2014-01-10'</span>, <span style="color: #FF0000;">'Client 3'</span>, <span style="color: #cc66cc;">7</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">25</span>, <span style="color: #FF0000;">'2014-01-06'</span>, <span style="color: #FF0000;">'Client 3'</span>, <span style="color: #cc66cc;">8</span>, <span style="color: #cc66cc;">700</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">26</span>, <span style="color: #FF0000;">'2014-01-07'</span>, <span style="color: #FF0000;">'Client 3'</span>, <span style="color: #cc66cc;">8</span>, <span style="color: #cc66cc;">700</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">27</span>, <span style="color: #FF0000;">'2014-01-08'</span>, <span style="color: #FF0000;">'Client 3'</span>, <span style="color: #cc66cc;">8</span>, <span style="color: #cc66cc;">700</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">28</span>, <span style="color: #FF0000;">'2014-01-09'</span>, <span style="color: #FF0000;">'Client 3'</span>, <span style="color: #cc66cc;">8</span>, <span style="color: #cc66cc;">700</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">29</span>, <span style="color: #FF0000;">'2014-01-10'</span>, <span style="color: #FF0000;">'Client 3'</span>, <span style="color: #cc66cc;">8</span>, <span style="color: #cc66cc;">700</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">30</span>, <span style="color: #FF0000;">'2014-01-03'</span>, <span style="color: #FF0000;">'Client 4'</span>, <span style="color: #cc66cc;">9</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">31</span>, <span style="color: #FF0000;">'2014-01-06'</span>, <span style="color: #FF0000;">'Client 4'</span>, <span style="color: #cc66cc;">9</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">32</span>, <span style="color: #FF0000;">'2014-01-07'</span>, <span style="color: #FF0000;">'Client 4'</span>, <span style="color: #cc66cc;">9</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">33</span>, <span style="color: #FF0000;">'2014-01-08'</span>, <span style="color: #FF0000;">'Client 4'</span>, <span style="color: #cc66cc;">9</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">34</span>, <span style="color: #FF0000;">'2014-01-09'</span>, <span style="color: #FF0000;">'Client 4'</span>, <span style="color: #cc66cc;">9</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">35</span>, <span style="color: #FF0000;">'2014-01-10'</span>, <span style="color: #FF0000;">'Client 4'</span>, <span style="color: #cc66cc;">9</span>, <span style="color: #cc66cc;">650</span> <span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
Nous créons ici un ensemble de lignes d’intervention de nos collaborateurs chez les clients. Nous souhaitons avoir des informations sur les mois de travail.<br />
<br />
 <br />
<b><font color="#0000FF">Quelle est la somme des facturations de nos collaborateurs pour les mois écoulés, sans tenir compte du lieu de l’intervention ?<br />
</font></b><br />
<br />
 <div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">SELECT</span> NOM_EMPLOYE
     , MONTH<span class="br0">&#40;</span> DATE_INTERVENTION <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> <span style="color: black;">[MOIS_INTERVENTION]</span>
     , <span style="color: #0000ff;">SUM</span><span class="br0">&#40;</span> FACTURATION <span class="br0">&#41;</span>         <span style="color: #0000ff;">AS</span> <span style="color: black;">[SOMME_FACTUREE]</span>
  <span style="color: #0000ff;">FROM</span> dbo.TB_EMPLOYES E
       <span style="color: #0000ff;">INNER</span> <span style="color: #0000ff;">JOIN</span> dbo.INTERVENTION_CLIENT I <span style="color: #0000ff;">ON</span> E.ID_EMPLOYE = I.EMPLOYE_ID
 <span style="color: #0000ff;">GROUP</span> <span style="color: #0000ff;">BY</span> NOM_EMPLOYE, MONTH<span class="br0">&#40;</span> DATE_INTERVENTION <span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p207962d1461672637/autres-langages/pascal/turbo-pascal/tp-lire-ligne-l-ecran-stocker-chaine/exemple4.jpg/" border="0" alt="Nom : Exemple4.jpg
Affichages : 10574
Taille : 21,0 Ko"  style="float: CONFIG" /></div> <br />
Nous avons pris en compte 3 éléments de la demande.<br />
<br />
<ul><li style="">Mois d’Intervention</li><li style="">Collaborateur</li><li style="">Somme des facturations. </li></ul><br />
<br />
<ul><li style="">Ces 3 informations permettent d’identifier le groupement nécessaire ainsi que l’agrégation souhaitée. </li></ul><br />
Nous nous retrouvons avec la fonction MONTH(), qui permet de ressortir le mois d’une date, dans le select. Contrairement au ORDER BY qui peut fonctionner avec la position du champ dans le select, GROUP BY nécessite de reproduire exactement les mêmes commandes que lors du SELECT.<br />
<br />
<ul><li style="">Pour faciliter l’écriture d’un GROUP BY, une CTE, une table Dérivée ou une l’utilisation d’une vue, sont de bonnes solutions. </li></ul><br />
 <br />
 <br />
<b><font color="#0000FF">La clause HAVING</font></b><br />
<br />
               Maintenant que nous savons faire un groupement de données afin de l’agréger, nous allons voir comment exploiter le résultat de notre groupement et comment limiter les résultats à nos attentes.<br />
Nous l’avons vu plus haut, il est possible de calculer des sommes d’interventions d’une personne, maintenant, imaginons que les consultants envoyés en missions ont un coût pour l’entreprise. Ce coût, c’est le salaire.<br />
A partir de ces deux informations que sont le salaire et les interventions, nous pouvons en déduire quel consultant est « rentable » ou non, et pour ce faire, il nous est possible de faire des comparaisons entre la valeur d’un champ (ou le résultat d’une requête)<br />
 <br />
A partir de notre jeu de données, nous allons faire un test.<br />
<br />
<ul><li style="">Nous savons que nous avons pu facturer nos prestataires à différents clients au cours du mois. Cependant, est-ce que ces personnes nous rapportent suffisamment par rapport à leur salaire, ou serait-il nécessaire de leur trouver plus de mission. Ou bien faut-il facturer plus les clients ? </li></ul><br />
Nous connaissons le salaire des employés, et nous venons de calculer la valeur de leurs différentes interventions.<br />
<b><font color="#0000FF">Cependant, qu’en est-il de ce qu’ils rapportent à l’entreprise ?<br />
</font></b><br />
<br />
Nous allons utiliser la fonction HAVING. Elle doit nous permettre de comparer le résultat d’un groupement à une valeur fixe.<br />
 <br />
Pour ce faire, reprenons notre précédente requête et ajoutons la clause.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:120px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">SELECT</span> NOM_EMPLOYE
     , MONTH<span class="br0">&#40;</span> DATE_INTERVENTION <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> <span style="color: black;">[MOIS_INTERVENTION]</span>
     , <span style="color: #0000ff;">SUM</span><span class="br0">&#40;</span> FACTURATION <span class="br0">&#41;</span>         <span style="color: #0000ff;">AS</span> <span style="color: black;">[SOMME_FACTUREE]</span>
  <span style="color: #0000ff;">FROM</span> dbo.TB_EMPLOYES E
       <span style="color: #0000ff;">INNER</span> <span style="color: #0000ff;">JOIN</span> dbo.INTERVENTION_CLIENT I <span style="color: #0000ff;">ON</span> E.ID_EMPLOYE = I.EMPLOYE_ID
 <span style="color: #0000ff;">GROUP</span> <span style="color: #0000ff;">BY</span> NOM_EMPLOYE, SALAIRE_EMPLOYE, MONTH<span class="br0">&#40;</span> DATE_INTERVENTION <span class="br0">&#41;</span>
 <span style="color: #0000ff;">HAVING</span> <span style="color: #0000ff;">SUM</span><span class="br0">&#40;</span> FACTURATION <span class="br0">&#41;</span> &gt; SALAIRE_EMPLOYE;</pre></td></tr></table></pre>
</div>Vous pourrez constater que le groupement devient quelque peu différent. En effet, l’ajout du SALAIRE_EMPLOYE dans le groupement devient obligatoire si l’on souhaite le comparer. Pourquoi ?<br />
Comme expliqué plus haut, toute colonne utilisée dans la requête et n’étant pas soumise à un agrégat doit obligatoirement se trouver dans le groupement.<br />
J’ai besoin de comparer le SALAIRE à la somme des facturations. Il me faut donc définir le SALAIRE comme une donnée non agrégée.<br />
 <br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p207963d1461672700/autres-langages/pascal/turbo-pascal/tp-lire-ligne-l-ecran-stocker-chaine/exemple5.jpg/" border="0" alt="Nom : Exemple5.jpg
Affichages : 10441
Taille : 18,9 Ko"  style="float: CONFIG" /></div> <br />
Le résultat est sans appel ! Il manque John à l’appel des personnes « rentables ». Qu’à cela ne tienne, on facturera de la même façon que les autres ;)<br />
 <br />
 <br />
Maintenant que l’on a vu les fonctionnalités de base des groupements, nous allons voir quelques fonctionnalités avancées qui devraient vous faciliter la vie pour les rapports.<br />
 <br />
<b><font color="#0000FF">GROUP BY ROLLUP</font></b><br />
<br />
 <br />
Nous l’avons vu, GROUP BY est une fonction assez simple qui agrège les données sur des critères spécifiques mais ne donne pas de détails ni ne fait de sommes particulières.<br />
 <br />
Nous allons compléter notre jeu de données avec des interventions sur un nouveau mois.<br />
 <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">36</span>, <span style="color: #FF0000;">'2014-02-03'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">37</span>, <span style="color: #FF0000;">'2014-02-04'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">500</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">38</span>, <span style="color: #FF0000;">'2014-02-05'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">39</span>, <span style="color: #FF0000;">'2014-02-06'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">40</span>, <span style="color: #FF0000;">'2014-02-07'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">41</span>, <span style="color: #FF0000;">'2014-02-10'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">42</span>, <span style="color: #FF0000;">'2014-02-11'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">43</span>, <span style="color: #FF0000;">'2014-02-12'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">44</span>, <span style="color: #FF0000;">'2014-02-13'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">45</span>, <span style="color: #FF0000;">'2014-02-14'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">46</span>, <span style="color: #FF0000;">'2014-02-03'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">4</span>, <span style="color: #cc66cc;">400</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">47</span>, <span style="color: #FF0000;">'2014-02-04'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">4</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">48</span>, <span style="color: #FF0000;">'2014-02-05'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">4</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">49</span>, <span style="color: #FF0000;">'2014-02-06'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">4</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">50</span>, <span style="color: #FF0000;">'2014-02-07'</span>, <span style="color: #FF0000;">'Client 1'</span>, <span style="color: #cc66cc;">4</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">51</span>, <span style="color: #FF0000;">'2014-02-03'</span>, <span style="color: #FF0000;">'Client 2'</span>, <span style="color: #cc66cc;">6</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">52</span>, <span style="color: #FF0000;">'2014-02-04'</span>, <span style="color: #FF0000;">'Client 2'</span>, <span style="color: #cc66cc;">6</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">53</span>, <span style="color: #FF0000;">'2014-02-05'</span>, <span style="color: #FF0000;">'Client 2'</span>, <span style="color: #cc66cc;">6</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">54</span>, <span style="color: #FF0000;">'2014-02-06'</span>, <span style="color: #FF0000;">'Client 2'</span>, <span style="color: #cc66cc;">6</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">55</span>, <span style="color: #FF0000;">'2014-02-07'</span>, <span style="color: #FF0000;">'Client 2'</span>, <span style="color: #cc66cc;">6</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">56</span>, <span style="color: #FF0000;">'2014-02-10'</span>, <span style="color: #FF0000;">'Client 2'</span>, <span style="color: #cc66cc;">6</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">57</span>, <span style="color: #FF0000;">'2014-02-19'</span>, <span style="color: #FF0000;">'Client 2'</span>, <span style="color: #cc66cc;">6</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">58</span>, <span style="color: #FF0000;">'2014-02-06'</span>, <span style="color: #FF0000;">'Client 3'</span>, <span style="color: #cc66cc;">7</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">59</span>, <span style="color: #FF0000;">'2014-02-07'</span>, <span style="color: #FF0000;">'Client 3'</span>, <span style="color: #cc66cc;">7</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">60</span>, <span style="color: #FF0000;">'2014-02-10'</span>, <span style="color: #FF0000;">'Client 3'</span>, <span style="color: #cc66cc;">7</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">61</span>, <span style="color: #FF0000;">'2014-02-11'</span>, <span style="color: #FF0000;">'Client 3'</span>, <span style="color: #cc66cc;">7</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">62</span>, <span style="color: #FF0000;">'2014-02-12'</span>, <span style="color: #FF0000;">'Client 3'</span>, <span style="color: #cc66cc;">7</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">63</span>, <span style="color: #FF0000;">'2014-02-06'</span>, <span style="color: #FF0000;">'Client 3'</span>, <span style="color: #cc66cc;">8</span>, <span style="color: #cc66cc;">700</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">64</span>, <span style="color: #FF0000;">'2014-02-07'</span>, <span style="color: #FF0000;">'Client 3'</span>, <span style="color: #cc66cc;">8</span>, <span style="color: #cc66cc;">700</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">65</span>, <span style="color: #FF0000;">'2014-02-10'</span>, <span style="color: #FF0000;">'Client 3'</span>, <span style="color: #cc66cc;">8</span>, <span style="color: #cc66cc;">700</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">66</span>, <span style="color: #FF0000;">'2014-02-11'</span>, <span style="color: #FF0000;">'Client 3'</span>, <span style="color: #cc66cc;">8</span>, <span style="color: #cc66cc;">700</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">67</span>, <span style="color: #FF0000;">'2014-02-12'</span>, <span style="color: #FF0000;">'Client 3'</span>, <span style="color: #cc66cc;">8</span>, <span style="color: #cc66cc;">700</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">68</span>, <span style="color: #FF0000;">'2014-02-03'</span>, <span style="color: #FF0000;">'Client 4'</span>, <span style="color: #cc66cc;">9</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">69</span>, <span style="color: #FF0000;">'2014-02-06'</span>, <span style="color: #FF0000;">'Client 4'</span>, <span style="color: #cc66cc;">9</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">70</span>, <span style="color: #FF0000;">'2014-02-07'</span>, <span style="color: #FF0000;">'Client 4'</span>, <span style="color: #cc66cc;">9</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">71</span>, <span style="color: #FF0000;">'2014-02-10'</span>, <span style="color: #FF0000;">'Client 4'</span>, <span style="color: #cc66cc;">9</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">72</span>, <span style="color: #FF0000;">'2014-02-11'</span>, <span style="color: #FF0000;">'Client 4'</span>, <span style="color: #cc66cc;">9</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> dbo.INTERVENTION_CLIENT
<span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span> <span style="color: #cc66cc;">73</span>, <span style="color: #FF0000;">'2014-02-12'</span>, <span style="color: #FF0000;">'Client 4'</span>, <span style="color: #cc66cc;">9</span>, <span style="color: #cc66cc;">750</span> <span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div> <br />
Nous voici donc avec un jeu de données pour janvier et février. Si l’on refait la requête précédente, nous aurons de nouvelles lignes dans le tableau.<br />
 <br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p207977d1461675496/autres-langages/pascal/turbo-pascal/tp-lire-ligne-l-ecran-stocker-chaine/exemple6.jpg/" border="0" alt="Nom : Exemple6.jpg
Affichages : 10690
Taille : 35,2 Ko"  style="float: CONFIG" /></div> <br />
Nous observons bien les 2 mois et les noms des employés associés à chaque mois d’intervention.<br />
 <br />
<b><font color="#0000FF">Ce total n’est pas assez précis ! Il me faut le calcul annuel par employé ET un total annuel de l’entreprise !</font></b><br />
<br />
 <br />
Le GROUP BY est, sans conteste, quelque chose de courant dans les bases de données. Mais il a ses limites. La question, au-dessus, va nous poser un problème.<br />
<b><font color="#0000FF">Comment pouvons nous agréger à différents niveau dans une même requête ?</font></b><br />
<br />
 <br />
               La réponse est « Impossible en une requête avec un simple GROUP BY. Pour réaliser la demande, il nous faut 3 requêtes que l’on va unir avec la clause UNION.<br />
 <br />
La première, on l’a vu au-dessus, calcule au mois. La seconde (ci-dessous) calcule à l’employé.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">SELECT</span> NOM_EMPLOYE
     , <span style="color: #FF0000;">'Total'</span>            <span style="color: #0000ff;">AS</span> <span style="color: black;">[MOIS_INTERVENTION]</span>
     , <span style="color: #0000ff;">SUM</span><span class="br0">&#40;</span> FACTURATION <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> <span style="color: black;">[SOMME_FACTUREE]</span>
  <span style="color: #0000ff;">FROM</span> dbo.TB_EMPLOYES E
       <span style="color: #0000ff;">INNER</span> <span style="color: #0000ff;">JOIN</span> dbo.INTERVENTION_CLIENT I <span style="color: #0000ff;">ON</span> E.ID_EMPLOYE = I.EMPLOYE_ID
 <span style="color: #0000ff;">GROUP</span> <span style="color: #0000ff;">BY</span> NOM_EMPLOYE;</pre></td></tr></table></pre>
</div><br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p207976d1461675252/autres-langages/pascal/turbo-pascal/tp-lire-ligne-l-ecran-stocker-chaine/exemple7.jpg/" border="0" alt="Nom : Exemple7.jpg
Affichages : 10330
Taille : 22,8 Ko"  style="float: CONFIG" /></div> <br />
Cette requête calcul le total des interventions par utilisateur et devrait être unie à la précédente afin de restituer en un seul jeu de données le total par utilisateur.<br />
Enfin, une troisième requête est nécessaire pour calculer le total global des interventions.<br />
 <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">SELECT</span> <span style="color: #FF0000;">'Total'</span>            <span style="color: #0000ff;">AS</span> NOM_EMPLOYE
     , <span style="color: #0000ff;">NULL</span>               <span style="color: #0000ff;">AS</span> <span style="color: black;">[MOIS_INTERVENTION]</span>
     , <span style="color: #0000ff;">SUM</span><span class="br0">&#40;</span> FACTURATION <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> <span style="color: black;">[SOMME_FACTUREE]</span>
  <span style="color: #0000ff;">FROM</span> dbo.TB_EMPLOYES E
       <span style="color: #0000ff;">INNER</span> <span style="color: #0000ff;">JOIN</span> dbo.INTERVENTION_CLIENT I <span style="color: #0000ff;">ON</span> E.ID_EMPLOYE = I.EMPLOYE_ID;</pre></td></tr></table></pre>
</div><br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p207975d1461675230/autres-langages/pascal/turbo-pascal/tp-lire-ligne-l-ecran-stocker-chaine/exemple8.jpg/" border="0" alt="Nom : Exemple8.jpg
Affichages : 10326
Taille : 9,1 Ko"  style="float: CONFIG" /></div> <br />
Ce tableau, représente l’union des 3 requêtes<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p207974d1461675207/autres-langages/pascal/turbo-pascal/tp-lire-ligne-l-ecran-stocker-chaine/exemple9.jpg/" border="0" alt="Nom : Exemple9.jpg
Affichages : 10646
Taille : 54,2 Ko"  style="float: CONFIG" /></div> <br />
En faisant un tri sur le nom puis le mois d’intervention, il est possible d’obtenir un tableau plus cohérent. Cependant, nous pouvons le constater, Virginie est dans l’ordre alphabétique et se retrouve après le total. Pour contourner ce problème, il nous faudrait rajouter une colonne avec un chiffre définis ce qui rajouterais encore du code !<br />
 <br />
 <br />
 <br />
Maintenant Le ROLLUP !<br />
 <br />
Comment cela fonctionne ? Et bien comme un GROUP BY nous citons une série de colonnes à regrouper.<br />
Dans notre cas, toujours le mois et le consultant.<br />
 <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">SELECT</span> NOM_EMPLOYE
     , MONTH<span class="br0">&#40;</span> DATE_INTERVENTION <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> <span style="color: black;">[MOIS_INTERVENTION]</span>
     , <span style="color: #0000ff;">SUM</span><span class="br0">&#40;</span> FACTURATION <span class="br0">&#41;</span>         <span style="color: #0000ff;">AS</span> <span style="color: black;">[SOMME_FACTUREE]</span>
  <span style="color: #0000ff;">FROM</span> dbo.TB_EMPLOYES E
       <span style="color: #0000ff;">INNER</span> <span style="color: #0000ff;">JOIN</span> dbo.INTERVENTION_CLIENT I <span style="color: #0000ff;">ON</span> E.ID_EMPLOYE = I.EMPLOYE_ID
 <span style="color: #0000ff;">GROUP</span> <span style="color: #0000ff;">BY</span> ROLLUP <span class="br0">&#40;</span>NOM_EMPLOYE, MONTH<span class="br0">&#40;</span> DATE_INTERVENTION <span class="br0">&#41;</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div>Vous constaterez la forme de l’écriture. Nous sommes toujours dans un GROUP BY à ceci près que nous précisons la fonctionnalité ROLLUP et que nous plaçons entre () les colonnes du groupement. Pourquoi ? Simplement parce que cette fonction nous permet, en une requête, d’afficher plusieurs groupements différents, tous séparés par une « , ». D’où le besoin des parenthèses pour permettre au SGBD de ne pas s’emmêler les pinceaux.<br />
 <br />
Le résultat est immédiat (ou presque tout dépend des volumes et de l'optimisation de votre base!)<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p207973d1461675165/autres-langages/pascal/turbo-pascal/tp-lire-ligne-l-ecran-stocker-chaine/exemple10.jpg/" border="0" alt="Nom : Exemple10.jpg
Affichages : 10651
Taille : 55,6 Ko"  style="float: CONFIG" /></div> <br />
Le SGBD a déjà calculé les sous-niveaux. Un total mensuel, un total par employé et un total !<br />
 <br />
<b><font color="#0000FF">Que fait concrètement ROLLUP ?</font></b><br />
<br />
 <br />
Et bien, pour chaque colonne du groupement en partant de la droite il va calculer les regroupements à tous les niveaux. Dans notre cas, il calcule le groupement par PERSONNE/ANNEE puis, simplement par PERSONNE et pour finir sans groupement.<br />
Il rassemble nos 3 requêtes précédentes pour lesquelles j’ai dû faire une manipulation pour supprimer les colonnes en trop dans les groupements.<br />
 <br />
Comme vous pouvez le constater, les regroupements supérieurs n’ont pas de valeur. Il nous suffira simplement de mettre des fonctions ISNULL afin de placer les valeurs que l’on souhaite.<br />
 <br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:132px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">SELECT</span> ISNULL<span class="br0">&#40;</span> NOM_EMPLOYE, <span style="color: #FF0000;">'Total Annuel'</span> <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> NOM_EMPLOYE
     , <span style="color: #0000ff;">CASE</span> <span style="color: #0000ff;">WHEN</span> NOM_EMPLOYE <span style="color: #0000ff;">IS</span> <span style="color: #0000ff;">NULL</span> <span style="color: #0000ff;">AND</span> MONTH<span class="br0">&#40;</span> DATE_INTERVENTION <span class="br0">&#41;</span> <span style="color: #0000ff;">IS</span> <span style="color: #0000ff;">NULL</span>
            <span style="color: #0000ff;">THEN</span> <span style="color: #0000ff;">NULL</span>
            <span style="color: #0000ff;">ELSE</span> ISNULL<span class="br0">&#40;</span> <span style="color: #0000ff;">CAST</span><span class="br0">&#40;</span> MONTH<span class="br0">&#40;</span> DATE_INTERVENTION <span class="br0">&#41;</span> <span style="color: #0000ff;">AS</span> <span style="color: #0000ff;">VARCHAR</span> <span class="br0">&#41;</span>, <span style="color: #FF0000;">'Total Mensuel'</span> <span class="br0">&#41;</span> <span style="color: #0000ff;">END</span> <span style="color: #0000ff;">AS</span> <span style="color: black;">[MOIS_INTERVENTION]</span>
     , <span style="color: #0000ff;">SUM</span><span class="br0">&#40;</span> FACTURATION <span class="br0">&#41;</span>         <span style="color: #0000ff;">AS</span> <span style="color: black;">[SOMME_FACTUREE]</span>
  <span style="color: #0000ff;">FROM</span> dbo.TB_EMPLOYES E
       <span style="color: #0000ff;">INNER</span> <span style="color: #0000ff;">JOIN</span> dbo.INTERVENTION_CLIENT I <span style="color: #0000ff;">ON</span> E.ID_EMPLOYE = I.EMPLOYE_ID
 <span style="color: #0000ff;">GROUP</span> <span style="color: #0000ff;">BY</span> ROLLUP <span class="br0">&#40;</span>NOM_EMPLOYE, MONTH<span class="br0">&#40;</span> DATE_INTERVENTION <span class="br0">&#41;</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div> <br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p207972d1461675145/autres-langages/pascal/turbo-pascal/tp-lire-ligne-l-ecran-stocker-chaine/exemple11.jpg/" border="0" alt="Nom : Exemple11.jpg
Affichages : 10752
Taille : 58,5 Ko"  style="float: CONFIG" /></div> <br />
 <br />
Et voilà, comment en une requête on peut ressortir un tableau complet et juste !</blockquote>

]]></content:encoded>
			<dc:creator>Lyche</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/135170-lyche/b1329/l-agregation-donnees/</guid>
		</item>
	</channel>
</rss>
