Bonjour,

Voilà, je me retrouve face à une requête trop complexe pour moi, j'ai besoin d'aide

Contexte :
Il s'agit d'une table qui liste des mails envoyés concernant un article. Elle contient un identifiant unique (de type entier auto-incrémenté), l'identifiant de l'article, l'adresse email du destinataire, un sujet, un corps, une date d'envoi. Cette table est liée à 3 autres tables qui permettent de savoir si le mail est en cours d'envoi, envoyé ou envoi échoué (tables MAILS_EN_COURS, MAILS_OK et MAILS_KO
Je veux afficher un résumé par article, avec le nombre de destinataires total, le nombre de mails envoyés, le nombre en cours d'envoi et le nombre en échec.
Jusque là, pas de problème. Cependant, ma seconde table concernant l'état des mails doit être vidée régulièrement. Je perd alors l'état des mails. Je veux donc mettre à jour un champ ENVOI dans ma première table lors de la purge de la table 2 mettre a NULL le champ IDMAIL de la table 1 qui fait référence à la table 2

Problème :
Comment récupérer dans une seule requête les données issues des tables A + B et les données issues uniquement de la table A ?

Code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
TABLE 1 : MAILS_ENVOIS
------------------------
ID | ID_ARTICLE | DESTINATAIRE   | ENVOI | IDMAIL
-------------------------------------------------
1  | 1          | tada1@tutu.com | NULL  | 1
2  | 1          | tudu1@tada.com | NULL  | 2
3  | 1          | tudu2@tada.com | NULL  | 3
4  | 1          | tudu3@tada.com | NULL  | 4
5  | 2          | toto1@tudu.com | NULL  | NULL    -- En cours d'envoi
6  | 2          | toto2@tudu.com | 0     | NULL         -- Echec
7  | 2          | toto3@tudu.com | 1     | NULL         -- Envoyé
 
 
TABLE 2 : MAILS_ENCOURS
--------------------------
ID
--
1    
 
TABLE 3 : MAILS_OK
--------------------
ID
--
2
3
 
TABLE 4 : MAILS_KO
--------------------
ID
--
4
Je veux donc retrouver quelque chose comme ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
ID_ARTICLE | NB_DESTINATAIRES | NB_OK | NB_EN_COURS | NB_KO
-----------------------------------------------------------------
1          | 4                | 2     | 1           | 1
2          | 3                | 1     | 1           | 1
J'ai bien la requête pour les données présentent dans les tables 1 et 2 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
SELECT
	MAILS_ENVOIS.ID_ARTICLE, 
	COUNT(*) AS NB_DESTINATAIRES,
	COUNT(M1.ID) AS NB_OK,
	COUNT(M2.ID) AS NB_EN_COURS,
	COUNT(M3.ID) AS NB_KO,
FROM         
    dbo.MAILS_ENVOIS 
    LEFT JOIN MAILS_EN_COURS M1 ON M1.ID = MAILS_ENVOIS.IDMAIL
    LEFT JOIN MAILS_OK M2 ON M2.ID = MAILS_ENVOIS.IDMAIL
    LEFT JOIN MAILS_KO M3 ON M3.ID = MAILS_ENVOIS.IDMAIL
WHERE
	MAILS_ENVOIS.IDMAIL IS NOT NULL
GROUP BY 
	MAILS_ENVOIS.ID_ARTICLE
Je voudrais savoir comment modifier cette requête pour qu'elle prenne en compte les cas ou IDMAIL est NULL et que l'état des mails ne se trouve plus via une jointure mais via le champ ENVOI (NULL = en cours, 1 = envoyé et 0 = échec) (Dans ce cas, IDMAIL est NULL).

Merci de votre aide