Ana içeriğe geç
Kesit SQL
Orta · İK Analitiği

Kadro (headcount): bir tarihte, her ay ve kırılımlarıyla

Belirli bir tarihteki kadro, aylık kadro serisi için takvimle birleştirme, giriş–çıkış köprüsü ve kıdem dağılımı.

Uygulamada aç, 6 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

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;
KontrolKöprü tutmuyorsa (başlangıç + giriş − çıkış ≠ bitiş) tarih sınırlarında bir tutarsızlık vardır: ör. aynı gün girip çıkan kişi ya da sınır tarihinde < ile <= karışıklığı.

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.

Alıştırmalara geç (6)