web-dev-qa-db-fra.com

Joignez deux tables et renvoyez des données et comptez en une seule requête

J'ai deux tables dans une base de données SQL Server, une avec deux colonnes et une avec quatre:

  1. tbl_email_list

    1. email_list_idint (PK)
    2. email_list_namevarchar
  2. tbl_email-details

    1. email_uniq_idint (PK)
    2. email_list_idint (FK)
    3. email_addressvarchar
    4. blacklistbit

Je veux récupérer des données dans une requête qui devrait retourner

  1. Toutes les listes d'email de tbl_email_list;
  2. Le nombre total d'email_address associé à un email_list_id spécifique;
  3. Le nombre total d'adresses e-mail sur liste blanche (où liste noire = 0);
  4. Le nombre total d'adresses électroniques sur liste noire (où liste noire = 1).
5
Tufan Chand
select l.email_list_id, l.email_list_name,
    count(d.email_uniq_id) as full_count,
    count(case when d.blacklist = 0 then d.email_uniq_id end) as white_count,
    count(case when d.blacklist = 1 then d.email_uniq_id end) as black_count
from tbl_email_list as l
left join [tbl_email-details] as d on d.email_list_id = l.email_list_id
group by l.email_list_id, l.email_list_name;

En comptant les choses qui peuvent être nulles, nous laissons les zéros apparaître dans le jeu de résultats, ce qui est une technique très utile. Ici, je le fais pour les résultats de la liste noire et pour l'ensemble (basé sur la jointure externe).

6
Rob Farley

Essayez quelque chose comme ceci:

SELECT 
el.emali_list_name AS EmailList
,COUNT(*) AS EmailsCount 
,SUM(CASE WHEN ed.blacklist = 1 THEN 1 ELSE 0 END) AS BlackList4ListCouint
,SUM(CASE WHEN ed.blacklist = 0 THEN 1 ELSE 0 END) AS WhiteList4ListCouint
FROM [tbl_email_list] AS el LEFT JOIN [tbl_email-details] AS ed ON (el.email_list_id = ed.email_list_id) 
GROUP BY el.emali_list_name
ORDER BY EmailList;

Veuillez vérifier si la requête donne des résultats corrects.

Je suppose que vous n'avez pas 2 e-mails égaux dans la même liste. Sinon, dans certains cas, les calculs ne seront pas corrects.

2
Bogdan Bogdanov