T-SQL - Среднегодовой показатель сотрудника - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь составить среднегодовую численность работников за год.

Таблица 'a' построена таким образом:

CREATE TABLE [dbo]. [A] 
(
    [id] [INT] NOT NULL,
    [start] [DATETIME] NOT NULL,
    [end] [DATETIME] NOT NULL,
    [employee_code] [INT] NOT NULL
)

1 - 01/01/2016 - 03/31/2019 - 56
2 - 01/01/1995 - 06/06/2017 - 13
-
-

Если я просто посчитаю [employee_code] в период с 01.01.2017 по 31.12.2017, расчет будет неверным, поскольку он не составляет среднемесячного значения.

Вы можете мне помочь? (правильный расчет должен иметь 12 записей с указанием месячного номера и в конце делится на 12)

Я не могу сделать все с помощью команды T-SQL.

Вы можете мне помочь?


привет, спасибо, да, вот кем я был. Только одно, в результате запроса есть следующие записи:

1995 1 0 NULL
1995 2 0 NULL
1995 3 0 NULL
1995 4 0 NULL
1995 5 6 NULL
1995 6 6 NULL
1995 7 10 NULL
1995 8 10 NULL
1995 9 10 NULL
1995 10 12 NULL
1995 11 12 NULL
1995 12 12 NULL
NULL 78 1995 6.500000

Исходные данные, с которых я начал:

03/04/1995 10/20/2005 4
03/04/1995 19/06/2016 2
03/04/1995 12/15/2016 2847
03/04/1995            1
03/04/1995            5
03/04/1995            3
02/06/1995 03/07/2009 9
02/06/1995            8
02/06/1995            7
02/06/1995            6
09/15/1995 16/05/2017 34
09/15/1995            33

почему 6 "экодов" в мае, а не в апреле?

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

Согласно вашему комментарию и предыдущим ответам, вы ищете что-то подобное?

DECLARE @A table (
eid int NOT NULL,
estart datetime,
eend datetime,
ecode int)
insert into @A VALUES (1,'02/01/2016','03/31/2019',56),
(2,'05/01/1995','01/06/2017',13);

WITH mnths as (
  select CAST('01/01/1995' as date) as mnth UNION ALL
  select DATEADD(month,1,mnth) FROM mnths WHERE mnth<'12/01/2019'
), edata AS (
  SELECT mnth,
  (SELECT count(ecode) FROM @A A WHERE mnth between estart AND eend) ecnt
  FROM mnths
)
select * FROM(
    SELECT year(mnth) yr, month(mnth) mn, ecnt, null eavg 
    FROM edata
    union all
    SELECT year(mnth) yr, null mn, SUM(ecnt) as ecnt, SUM(ecnt) / 12.00 eavg 
    FROM edata
    GROUP BY year(mnth)) A
order by 
    A.yr, 
    CASE WHEN a.mn IS NULL THEN 13 else a.mn END
OPTION (MAXRECURSION 1000)
0 голосов
/ 31 мая 2019

Отредактировано :

WITH mnths as (
  select CAST('01/15/1995' as date) as mnth UNION ALL
  select DATEADD(month,1,mnth) FROM mnths WHERE mnth<'12/15/2019'
), edata AS (
  SELECT mnth,
  (SELECT count(ecode) FROM @A A 
   WHERE mnth between estart AND COALESCE(eend,getdate())) ecnt
  FROM mnths
)
SELECT year(mnth) yr, month(mnth) mn, AVG(ecnt+0.) emplcount
FROM edata 
group by year(mnth), month(mnth) 
WITH ROLLUP
OPTION (MAXRECURSION 1000)

Эта версия учитывает ваши последние изменения и использует ROLLUP для сокращения кода запроса, см. Демонстрационную версию здесь:

https://rextester.com/IQAB32422

К сожалению, ваши даты не были правильными, учитывая, что вы использовали американский синтаксис month/day/year.По этой причине я получил немного другие цифры ...

Сравнение того, работает ли работник в конкретном месяце, первоначально проводилось в первый день каждого месяца.Я изменил его сейчас до 15 числа каждого месяца.Но даже это только «произвольная» дата, и она не будет учитывать сотрудников, которые были там с 1-го по 14-е число месяца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...