SQL Group By с несколькими счетами - PullRequest
0 голосов
/ 08 февраля 2020

Я пытаюсь сгруппировать список услуг вместе с количеством заявителей в каждой услуге, но мне также необходимо подсчитать статус каждого кандидата.

Кандидаты table

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)

Service table:

 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   

Ответы [ 2 ]

0 голосов
/ 08 февраля 2020

Ваш запрос должен быть в порядке, но его можно упростить до:

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()).
0 голосов
/ 08 февраля 2020

Вы можете сделать условное агрегирование:

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 выражение; в зависимости от базы данных, которую вы фактически используете, могут существовать более точные альтернативы.

...