Aylık kadro serisi
Her ay sonu için aktif kişi sayısı: önce ay sonlarından bir takvim üret, sonra her tarih için “o tarihte aktif” koşuluyla say. Bu bir eşit olmayan birleştirmedir: takvimin her satırı, o tarihte aktif olan tüm çalışanlarla eşleşir.
WITH RECURSIVE ay(son) AS ( SELECT '2024-01-31' UNION ALL SELECT date(son, '+1 day', '+1 month', '-1 day') FROM ay WHERE son < '2024-12-31' ) SELECT ay.son, COUNT(e.emp_id) AS kadro FROM ay LEFT JOIN ik_employees e ON e.hire_date <= ay.son AND (e.term_date IS NULL OR e.term_date > ay.son) GROUP BY ay.son ORDER BY ay.son;
date(son, '+1 day', '+1 month', '-1 day') bir sonraki ayın son gününü verir (31 Ocak → 29 Şubat → 31 Mart).
Kadro köprüsü
Yönetim “yıl başında 1.400 kişiydik, yıl sonunda neden 1.360?” diye sorar. Cevap köprüdür: başlangıç + giriş − çıkış = bitiş.
SELECT SUM(CASE WHEN hire_date <= '2023-12-31' AND (term_date IS NULL OR term_date > '2023-12-31') THEN 1 ELSE 0 END) AS baslangic, SUM(CASE WHEN hire_date BETWEEN '2024-01-01' AND '2024-12-31' THEN 1 ELSE 0 END) AS giris, SUM(CASE WHEN term_date BETWEEN '2024-01-01' AND '2024-12-31' THEN 1 ELSE 0 END) AS cikis, SUM(CASE WHEN hire_date <= '2024-12-31' AND (term_date IS NULL OR term_date > '2024-12-31') THEN 1 ELSE 0 END) AS bitis FROM ik_employees;
Kıdem
Kıdem, işe girişten bugüne (ya da ayrılışa) geçen süredir. Yıl olarak: (julianday('2024-12-31') - julianday(hire_date)) / 365.25.