6/17
Perdus de vue (PDV) 1/2
Je voudrais le nombre de patients sous ARV qui sont perdus de vue (PDV).

Accordons-nous sur la définition de PDV: c'est un patient qui n'est pas passé au centre depuis un nombre x de mois et dont le décès n'est pas renseigné.
Pour chaque dossier, il faudrait chercher la dernière consultation médicale, le dernier examen de laboratoire, la dernière arrivée à l'accueil, la dernière dispensation, etc. Cela obligerait SQL à parcourir toutes ces tables pour chaque dossier or la table des dispensations par ex. est souvent très longue.
Pour accélérer le calcul, nous allons procéder autrement et compter seulement les dossiers des consultations récentes, des dispensations récentes, etc. puis déduire les autres, c'est-à-dire les PDV.
Pour cela, on va créer une table temporaire des patients passés récemment au centre. SQL s'occupe de créer une table en mémoire, juste le temps du calcul. Cela n'interfère pas avec les données de la base. Les tables temporaires sont détruites après le calcul.
! On va utiliser les mots clé CREATE, INSERT, DROP sur des tables temporaires. Ne les employez pas sur les données de la base, les pertes et les modifications de données seraient définitives.

Dans mon centre, un patient ARV est considéré comme perdu de vue après 3 mois.

C'est noté. Commençons par créer une table temporaire pour les dossiers passés récemment au centre. Cette table Temp ne contient qu'une colonne Doss car on n'a besoin que de stocker l'identifiant des dossiers:

DROP TABLE IF EXISTS Temp
CREATE TEMPORARY TABLE Temp (Doss INT)


DROP supprime la table au cas où elle a déjà été créée.
Doss INT indique la colonne à créer dans la table et son type de valeur. Ici, INT (= integer) désigne un nombre entier. C'est le type qui convient pour l'identifiant de dossier.

Ensuite, on remplit la table Temp avec les dossiers qui ont eu une consultation médicale ces 90 derniers jours:

INSERT INTO Temp (Doss) SELECT DISTINCT Doss FROM MediCons WHERE Dat_>=DATE_SUB(CURDATE(),INTERVAL 90 DAY)

Oh, encore de nouveaux mots SQL, on part en terre inconnue...

INSERT INTO ajoute des données à une table. Là, on ajoute des données à la table Temp dans sa colonne Doss.
Ce qu'on ajoute est défini par SELECT: c'est la colonne Doss de la table MediCons. On élimine les doublons de Doss avec DISTINCT.
De plus, une condition est posée sur la date de la table MediCons des consultations:
CURDATE() demande à SQL la date du jour (= current date)
DATE_SUB(a,b) soustrait b à a. Ici, on soustrait 90 jours (= day) à la date du jour.

Comme on va utiliser plusieurs fois le délai de 90 jours (pour l'accueil, les dispensations, etc.), je demande à SQL de le mémoriser une fois au début, à l'aide du mot clé SET. Le nom des valeurs mémorisées par SQL doit toujours commencer par "@". Je modifie mon texte pour utiliser dorénavant @nb_jour au lieu de 90:

SET @nb_jour=90
INSERT INTO Temp (Doss) SELECT DISTINCT Doss FROM MediCons WHERE Dat_>=DATE_SUB(CURDATE(),INTERVAL @nb_jour DAY)