Разделить значения на кварталы с помощью регистра и агрегации - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть набор данных Employee, как показано ниже. Дата начала - это дата найма работника, а дата окончания - это дата, когда работник ушел от работодателя. Оба имеют тип данных date.

Gender   StartDate       EndDate
 M       2010-04-30      2013-06-18
 F       2010-01-09      2015-06-19
 M       2009-09-08      2014-08-13

Я хотел бы разделить данные о сотрудниках на квартили на основе среднего числа месяцев работы. Результаты также включают в себя общее число сотрудников (столбец «Сотрудник»), процент сотрудников, являющихся мужчинами, процент сотрудников, являющихся женщинами, и среднее количество занятых месяцев. Ниже, пожалуйста, найдите ожидаемые результаты:

Quartile    Employee    %Male   %Female   AvgMonths
1             20        60.00    40.00     8.75
2             25        50.00    50.00     28.5
3             10        40.00    60.00     41.25

Я хотел бы получить квартиль 25%, 50% и 75% в зависимости от количества использованных месяцев и взять среднее значение для получения AvgMOnths.

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

declare @current date;
set @current='2012-12-31';

select count(*) as Employees,
       cast(cast(AVG(CASE WHEN Gender = 'M' THEN 1.0 ELSE 0 END)*100 as decimal(18,2)) as nvarchar(5)) +'%' as Male,
       cast(cast(AVG(CASE WHEN Gender = 'F' THEN 1.0 ELSE 0 END)*100 as decimal(18,2)) as nvarchar(5)) +'%' as Female,
       AVG(CASE WHEN EndDate is null then DATEDIFF(MONTH, StartDate, @current)
                when EndDate is not null then DATEDIFF(MONTH, StartDate, EndDate)
           end) as AvgMonths
from dbo.DimEmployee

------------------- ---- обновления -------------------------------------

Я понял сам по себе. ниже, пожалуйста, найдите код:

declare @current date;
set @current='2012-12-31';
select count(*) as Employees,
       cast(cast(AVG(CASE WHEN Gender = 'M' THEN 1.0 ELSE 0 END)*100 as decimal(18,2)) as nvarchar(10)) +'%' as Male,
       cast(cast(AVG(CASE WHEN Gender = 'F' THEN 1.0 ELSE 0 END)*100 as decimal(18,2)) as nvarchar(10)) +'%' as Female,
       AVG(t.EmployedMonths) as AvgMonths,
       Ntile(3) over (order by t.EmployedMonths asc) as Quartiles
from
      (select EmployeeKey, Gender,
       CASE WHEN EndDate is null then abs(DATEDIFF(MONTH, StartDate, @current))
            when EndDate is not null then abs(DATEDIFF(MONTH, StartDate, EndDate))
            end as EmployedMonths
        from dbo.DimEmployee)t
group by t.EmployedMonths

1 Ответ

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

Вы можете рассчитать квартиль, используя rank() и count(*) в качестве оконной функции:

select floor( rnk * 4.0 / cnt ) as quartile,
       count(*) as Employees,
       cast(cast(AVG(CASE WHEN Gender = 'M' THEN 1.0 ELSE 0 END)*100 as decimal(18,2)) as nvarchar(5)) + '%' as Male,
       cast(cast(AVG(CASE WHEN Gender = 'F' THEN 1.0 ELSE 0 END)*100 as decimal(18,2)) as nvarchar(5)) + '%' as Female,
       AVG(num_months * 1.0) as AvgMonths
from (select e.*,
             rank() over (partition by datediff(month, startdate, coalesce(enddate, @current))) - 1 as rnk,
             count(*) over () as cnt,
             datediff(month, startdate, coalesce(enddate, @current)) as num_months
      from dbo.DimEmployee e
     ) e
group by floor( rnk * 4.0 / cnt )
...