jeudi 21 mars 2019

EXCEL - Formule pour trouver la dernière occurrence d'un caractère

Voici une formule pour Excel permettant de récupérer les derniers caractères, à partir de la dernière occurrence d'un caractère ("/" pour illustrer l'exercice):
Par exemple:

"AA/BB/CC/DD" donne le résultat "DD".

Voici donc la formule:


=SIERREUR(DROITE(A1;NBCAR(A1)-TROUVE("\";SUBSTITUE(SUBSTITUE(A1;"\";" ");"/";"\";NBCAR(A1)-NBCAR(SUBSTITUE(A1;"/";"")))));"")



On utilise la possibilité de la fonction Excel SUBSTITUE de remplacer une seule occurrence, en particulier la dernière occurrence. Pour cela on récupère le nombre d'occurrence du caractère "/", à l'aide de la formule:

=NBCAR(A1)-NBCAR(SUBSTITUE(A1;"/";""))


Ensuite il suffit de remplacer cette dernière occurrence de "/" par un caractère unique (par exemple "\"), pour déterminer la position du dernier "/", en recherchant ensuite la position du caractère unique "\"). Pour garantir l'unicité e "\", il faut aussi remplacer la totalité des "\" par des espaces par exemple).

Formule pour la position de la dernière occurrence:

=TROUVE("\";SUBSTITUE(SUBSTITUE(A1;"\";" ");"/";"\";NBCAR(A1)-NBCAR(SUBSTITUE(A1;"/";""))))

Ce genre de formule serait plus simple à réaliser en VBA, mais l'exécution en VBA d'une formule peut être très coûteux en temps d’exécution, et de surcroît oblige à autoriser le VBA. Donc malgré la complexité de cette formule, elle est indispensable dans certain cas.

jeudi 31 janvier 2019

L'art et la manière du JOIN en SQL

En SQL, rien de plus simple et de plus compliquée à la fois que l'association de 2 tables.
Au début de mon apprentissage SQL, je ne connaissais que l'association de type:
    SELECT * FROM A,B WHERE C1=C2;

Comme Monsieur Jourdain, je faisais des jointures sans le savoir. J'étais à cette époque un homme inconscient de la terrible complexité de l'association de 2 tables.  Depuis j'ai découvert la syntaxe suivante (massivement utilisée actuellement):
  SELECT * FROM A LEFT JOIN B ON C1=C2;
C'est en étudiant ces "OUTER, INNER FULL, RIGH, LEFT JOIN and co" que j'ai pu apprécier la douce complexité d'un produit de matrice.

Plutôt qu'un long discours, voici 2 copies d'écrans permettant de faire un état de l'art des jointures SQL:

Le pré-requis pour comprendre ces différentes jointures, est la notion de "NULL", qui désigne une valeur (une cellule) qui ne peut être renseignée (déterminée) lors d'une jointure. Si vous voyez "null" suite à un SELECT, cela signifie qu'une valeur n'a pas pu être renseignée. Dans le cas d'une jointure à gauche par exemple (LEFT JOIN), cela signifie certainement qu'une ligne à gauche n'a pas trouvée de correspondance à droite (selon le critère ON spécifié). A noté que suite à de simple INSERT, on peut éventuellement créée des lignes avec des valeurs "null". La notion "null" est une notion centrale dans la logique SQL, essentielle bien au delà des jointures.


Voici la version texte (testée avec SQL Server 2012) :
DECLARE @T1 TABLE ( A int , B varchar(2) );
DECLARE @T2 TABLE ( C int , D varchar(2) );

INSERT INTO @T1
VALUES
(1,'a'),
(2,'b'),
(3,'c'),
(4,'d');

INSERT INTO @T2
VALUES
(1,'f'),
(1,'g'),
(4,'h'),
(5,'i');

SELECT * FROM @T1
    FULL OUTER JOIN @T2 ON A=C;

SELECT * FROM @T1
    RIGHT JOIN @T2 ON A=C;

SELECT * FROM @T1
    LEFT JOIN @T2 ON A=C;

SELECT * FROM @T1, @T2;

SELECT * FROM @T1, @T2
 WHERE A=C;

SELECT * FROM @T1
    FULL JOIN @T2 ON A=C
    WHERE A is null OR C IS NULL;