У меня есть набор данных 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