Найдите коэффициент закрытия людей

#sql-server

#sql-сервер

Вопрос:

У меня есть сотрудники, которым назначены задачи, мне нужно найти процент задач, которые сотрудник выполнил с начала года … из тех, которые были назначены ему. Если Джону назначено 10 задач, и он выполнил 5, мне нужно показать, что Джон закрыл .50 (50%).

У меня есть две таблицы: Задачи и Tasks_cstm

Задачи t

 | ID | STATUS |Date_Completed|
  

Статусы «Выполняется», «Не начато», «Завершено»

Tasks_cst tc

 | ID_C|Staff_Member|
  

Таблицы объединяются на t.id = tc.id_c

Это возвращает число завершенных:

 (select count(*)as Completed from tasks_CSTM tc
 join tasks t
 on t.id = tc.id_c
 where status = 'completed'
 group by staff_member_C )
  

Это возвращает общее количество задач:

 (select count(*)as Total from tasks_CSTM tc
join tasks t
on t.id = tc.id_c
group by staff_member_C )
  

Это то, что я придумал, но это ошибки: Подзапрос вернул более 1 значения.

 select staff_member_c,((select  count(*)as Completed from tasks_CSTM tc
join tasks t
on t.id = tc.id_c
where status = 'completed'
group by staff_member_C )/(select  count(*)as Total from tasks_CSTM tc
join tasks t
on t.id = tc.id_c
group by staff_member_C ))
from tasks t
join tasks_CSTM tc
on t.id = tc.id_C
group by staff_member_C
  

Любая помощь приветствуется.

Ответ №1:

Что-то вроде этого, я думаю:

 select staff_member_c, sum(case when status='completed' then 1.0 end)/count(*) as pctCompleted
from tasks_cstm tc
join tasks t
on t.id = tc.id_c
group by staff_member_c
  

Вам может понадобиться «else 0.0» в инструкции case (но не в MSSQL), и вам может понадобиться nullif(count(*),0) в знаменателе (но, вероятно, не в какой-либо СУБД).

Ответ №2:

Здесь есть пара проблем, с которыми нужно разобраться. Один из которых касается части «с начала года». Прямо сейчас, со столбцом Date_Completed, нет способа узнать, когда была назначена / создана задача, что сводит на нет нашу способность узнавать информацию за текущий год. Исключая эту часть вопроса, вот мой запрос, который должен сработать. У меня есть закомментированное предложение WHERE, которое можно легко адаптировать для использования столбца Date_Assigned для информации за текущий год.

 select
    staff_member
    , sum(case t.status when 'Completed' then 1.0 else 0 end) [Completed]
    , count(*) [Total]
    , sum(case t.status when 'Completed' then 1.0 else 0 end) / count(*) [CompletedPercent]
from
    tasks t
inner join tasks_cstm tc
    on t.id = tc.id_C
--where
--  dateadd(year, datediff(year, 0, Date_Assigned), 0) = dateadd(year, datediff(year, 0, getdate()), 0)
group by
    staff_member
  

И вот установочный код, который я использовал для (непонятного) тестирования:

 create table tasks (ID int, Status varchar(50), Date_Completed date)
create table tasks_cstm (ID_C int, Staff_Member varchar(50))

insert into tasks
select 1, 'Not Started', null
union all
select 2, 'Completed', '2011-04-15'
union all
select 3, 'In Progress', null

insert into tasks_cstm
select 1, 'Cadaeic'
union all
select 2, 'Cadaeic'
union all
select 3, 'Cadaeic'
  

В результате этого:

 staff_member        Completed            Total       CompletedPercent
------------------- -------------------- ----------- -----------------------
Cadaeic             1.0                  3           0.333333
  

Ответ №3:

 -- Tasks
declare @T table(ID int, Status varchar(20))
-- Tasks_cst
declare @TC table(ID_C int, Staff_Member varchar(20))

insert into @TC values (1, 'Staff 1')
insert into @TC values (2, 'Staff 2')
insert into @TC values (3, 'Staff 3')

insert into @T values (1, 'Completed')
insert into @T values (1, 'Completed')
insert into @T values (1, 'In Progress')
insert into @T values (2, 'Completed')
insert into @T values (2, 'In Progress')
insert into @T values (3, 'In Progress')

select *
from @TC as TC
  cross apply
    (select sum(case T.Status when 'Completed' then 1.0 else 0.0 end) / count(*)
     from @T as T
     where T.ID = TC.ID_C) as C(PrecentCompleted)
  

Результат

 ID_C        Staff_Member         PrecentCompleted
----------- -------------------- ---------------------------------------
1           Staff 1              0.666666
2           Staff 2              0.500000
3           Staff 3              0.000000