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