web-dev-qa-db-ja.com

2つのテーブルを結合してデータを返し、1つのクエリでカウントする

SQL Serverデータベースに2つのテーブルがあり、1つは2つの列、もう1つは4つの列です。

  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

返す必要がある1つのクエリでデータを取得したい

  1. Tbl_email_listのすべてのメーリングリスト。
  2. 特定のemail_list_idに関連付けられたemail_addressの総数。
  3. ホワイトリストに登録されたメールアドレスの総数(ブラックリスト= 0)。
  4. ブラックリストに登録されたメールアドレスの総数(ブラックリスト= 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;

Nullになる可能性のあるものをカウントすることにより、結果セットにゼロを表示します。これは非常に便利な手法です。ここでは、ブラックリストの結果と全体(外部結合に基づく)の両方に対してこれを行います。

6
Rob Farley

次のようなものを試してください:

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;

クエリの結果が正しいかどうかを確認してください。

同じリストに2つの同等のメールがないと思います。そうしないと、場合によっては計算が正しく行われません。

2
Bogdan Bogdanov