0

我正在尝试将服务列表以及每个服务中的申请人数量组合在一起,但我还需要计算每个申请人所处的状态。

申请人

serviceID  clientID    applicantID   status  
----------------------------------------------------
   1          41           1           1 (Processing)
   1          41           16          1 (Processing)
   1          41           15          2 (Ready)
   2          41           12          1 (Processing)
   2          41           18          3 (Complete)

服务表:

 serviceID   serviceName     
--------------------------
   1         Full Service     
   2         Part Service    

结果需要如下所示:

serviceName    totalApplicants  processingCount  readyCount  completeCount
--------------------------------------------------------------------------- 
Full Service        3                 2              1            0 
Part Service        2                 1              0            1

我有以下内容,但它在每一列中返回相同的计数:-

SELECT
    Services.serviceName,
    (COUNT(Applicants.applicantID)) AS totalApplicants, 
    ISNULL(SUM(CASE WHEN Applicants.status = 1 THEN 1 ELSE 0 END), 0) AS processingCount,
    ISNULL(SUM(CASE WHEN Applicants.status = 2 THEN 1 ELSE 0 END), 0) AS readyCount, 
    ISNULL(SUM(CASE WHEN Applicants.status = 3 THEN 1 ELSE 0 END), 0) AS completeCount
FROM
    Applicants
LEFT JOIN 
    Services ON Applicants.serviceID = Services.serviceID   
WHERE 
    Applicants.clientID = @CompanyID
GROUP BY
    Services.serviceName   
4

2 回答 2

0

您可以进行条件聚合:

select
    s.serviceName,
    count(s.serviceID) totalApplicants,
    sum(case when status = 1 then 1 else 0 end) processingCount,
    sum(case when status = 2 then 1 else 0 end) readyCount,
    sum(case when status = 3 then 1 else 0 end) completeCount
from service s
left join applicants a on a.serviceID = s.serviceID AND a.clientID = @CompanyID
group by s.serviceID, s.serviceName

条件表达式使用标准case表达式;根据您实际使用的数据库,可能存在更简洁的替代方案。

于 2020-02-07T23:42:28.827 回答
0

您的查询应该没问题,但可以简化为:

SELECT s.serviceName,
       COUNT(a.AppicantId) AS totalApplicants, 
       SUM(CASE WHEN a.status = 1 THEN 1 ELSE 0 END) AS processingCount,
       SUM(CASE WHEN a.status = 2 THEN 1 ELSE 0 END) AS readyCount, 
       SUM(CASE WHEN a.status = 3 THEN 1 ELSE 0 END) AS completeCount
FROM Services s LEFT JOIN
     Applicants a
     ON a.serviceID = s.serviceID AND
        a.clientID = @CompanyID
GROUP BY s.serviceName ; 

笔记:

  • 看起来您希望每个服务都有一行,所以它应该是LEFT JOIN.
  • 因此,对公司的过滤进入ON条款。
  • 表别名使查询更易于编写和阅读。
  • 不需要ISNULL()(我更喜欢COALESCE()ISNULL()
于 2020-02-07T23:45:19.853 回答