Тот факт, что вы складываете все эти UNION
вместе с жестко закодированным столбцом, должен указывать на то, что вы где-то упускаете набор. В данном случае это набор недель. Поместите их в таблицу (постоянную, временную или виртуальную через CTE), и этот запрос станет тривиальным.
SELECT
WKS.start_date,
COUNT(E.employee_id)
FROM
Report_Weeks WKS
LEFT OUTER JOIN Employees E ON
E.hire_date > WKS.start_date AND
E.hire_date < WKS.end_date
GROUP BY
WKS.start_date
ORDER BY
WKS.start_date
Поскольку вы ссылаетесь на "чистые" наймы, я предполагаю, что вы хотите работать и в терминациях. Вы можете сделать это, превратив его в SUM(CASE...)
, где вы используете 1 для новых сотрудников, 0 для людей за пределами этой недели или которые были наняты, а затем уволены в течение той же недели, и -1 для увольнений.
Как указывает JNK, порядок имеет значение в выражении CASE
. Также вы можете использовать ELSE
для обработки значений 0. Я бы предложил что-то вроде этого:
CASE
WHEN
E.hire_date BETWEEN WKS.start_date AND WKS.end_date AND
E.termination_date > WKS.end_date THEN 1
WHEN
E.termination_date BETWEEN WKS.start_date AND WKS.end_date AND
E.hire_date < WKS.end_date THEN -1
ELSE 0
END
Поскольку я использовал BETWEEN
, вам необходимо убедиться, что дата начала вашей недели не совпадает с датой окончания предыдущей недели.