SQL 在同一字段不同的 Where 子句上使用计数函数自联接
SQL Self Join with Count Function on same field different Where Clause
我有 2 个针对单个 table 上的单个字段的查询,我想加入一个查询...
查询 1:
SELECT completed_by_id AS WHO
, COUNT (activity_id) AS CALLS
FROM table1
WHERE activity_id = 'CALL'
AND YEAR(completed_date) = YEAR(GETDATE())
AND MONTH(completed_date) = MONTH(GETDATE())
GROUP BY completed_by_id
Returns:
WHO * CALLS
Joe Sales * 5
Jane Sales * 8
查询 2:
SELECT completed_by_id AS WHO
, COUNT (activity_id) AS VISITS
FROM table1
WHERE activity_id = 'VISIT'
AND YEAR(completed_date) = YEAR(GETDATE())
AND MONTH(completed_date) = MONTH(GETDATE())
GROUP BY completed_by_id
Returns:
WHO * VISITS
Joe Sales * 2
Jane Sales * 3
这两个都可以正常工作,但我想有一个查询 return 类似于:
WHO * CALLS * VISITS
Joe Sales * 5 * 2
Jane Sales * 8 * 3
我知道我需要自联接,但我不确定如何编写查询。
SELECT completed_by_id AS WHO
, sum(case when activity_id= 'CALL' then 1 else 0 end) AS CALLS
, sum(case when activity_id= 'visits' then 1 else 0 end) AS VISITS
FROM table1
WHERE activity_id in ('CALL','visits')
AND YEAR(completed_date) = YEAR(GETDATE())
AND MONTH(completed_date) = MONTH(GETDATE())
GROUP BY completed_by_id
这可以通过在 COUNT 中使用 CASE 语句来非常简单地完成。 COUNT 只是在 non-null 时递增,因此当它不是您要查找的内容时,您可以使用 CASE return NULL,或者您可以使用 SUM 和 return 1/0。
SELECT
completed_by_id AS WHO,
COUNT(CASE WHEN (activity_id='CALL' THEN 1 END)) AS CALLS,
COUNT(CASE WHEN (activity_id='VISIT' THEN 1 END)) AS VISITS
FROM table1
WHERE
activity_id IN ('CALL','VISIT') -- This is optional, but it could help efficiency a bit
AND YEAR(completed_date) = YEAR(GETDATE()) AND
MONTH(completed_date) = MONTH(GETDATE())
GROUP BY completed_by_id
我有 2 个针对单个 table 上的单个字段的查询,我想加入一个查询...
查询 1:
SELECT completed_by_id AS WHO
, COUNT (activity_id) AS CALLS
FROM table1
WHERE activity_id = 'CALL'
AND YEAR(completed_date) = YEAR(GETDATE())
AND MONTH(completed_date) = MONTH(GETDATE())
GROUP BY completed_by_id
Returns:
WHO * CALLS
Joe Sales * 5
Jane Sales * 8
查询 2:
SELECT completed_by_id AS WHO
, COUNT (activity_id) AS VISITS
FROM table1
WHERE activity_id = 'VISIT'
AND YEAR(completed_date) = YEAR(GETDATE())
AND MONTH(completed_date) = MONTH(GETDATE())
GROUP BY completed_by_id
Returns:
WHO * VISITS
Joe Sales * 2
Jane Sales * 3
这两个都可以正常工作,但我想有一个查询 return 类似于:
WHO * CALLS * VISITS
Joe Sales * 5 * 2
Jane Sales * 8 * 3
我知道我需要自联接,但我不确定如何编写查询。
SELECT completed_by_id AS WHO
, sum(case when activity_id= 'CALL' then 1 else 0 end) AS CALLS
, sum(case when activity_id= 'visits' then 1 else 0 end) AS VISITS
FROM table1
WHERE activity_id in ('CALL','visits')
AND YEAR(completed_date) = YEAR(GETDATE())
AND MONTH(completed_date) = MONTH(GETDATE())
GROUP BY completed_by_id
这可以通过在 COUNT 中使用 CASE 语句来非常简单地完成。 COUNT 只是在 non-null 时递增,因此当它不是您要查找的内容时,您可以使用 CASE return NULL,或者您可以使用 SUM 和 return 1/0。
SELECT
completed_by_id AS WHO,
COUNT(CASE WHEN (activity_id='CALL' THEN 1 END)) AS CALLS,
COUNT(CASE WHEN (activity_id='VISIT' THEN 1 END)) AS VISITS
FROM table1
WHERE
activity_id IN ('CALL','VISIT') -- This is optional, but it could help efficiency a bit
AND YEAR(completed_date) = YEAR(GETDATE()) AND
MONTH(completed_date) = MONTH(GETDATE())
GROUP BY completed_by_id