let Source = Excel.Workbook(File.Contents("C:\temp\Personalausgeschieden.xlsx"), null, true), Data = Source{0}[Data], Head = Table.PromoteHeaders(Data, [PromoteAllScalars = true]), Ren = Table.RenameColumns(Head, { {"Personalnummer", "PERNR_Text"}, {"Nachname, Vorname (Link Personal)", "Name_Voll"}, {"Stelle-1", "Stelle"}, {"Organisation-1", "Organisationseinheit"}, {"Leitung j/n", "Leitung"}, {"Austrittsdatum", "Austrittsdatum_Raw"}, {"Austrittsart", "Austrittsart"}, {"Eintrittsdatum", "Eintrittsdatum_Raw"}, {"Personal Status", "Status"} }), AddPernr = Table.AddColumn(Ren, "Personalnummer", each try Number.FromText(Text.Trim(Text.From([PERNR_Text]))) otherwise null, Int64.Type), // Datumsfelder (Excel liefert evtl. schon als Date) AddAustritt = Table.AddColumn(AddPernr, "Austrittsdatum", each let raw = [Austrittsdatum_Raw] in if raw is date then raw else if raw is datetime then Date.From(raw) else if raw is number then Date.AddDays(#date(1899, 12, 30), Number.RoundDown(raw)) else if (try Number.FromText(Text.From(raw)) otherwise null) <> null then Date.AddDays(#date(1899, 12, 30), Number.RoundDown(Number.FromText(Text.From(raw)))) else try Date.FromText(Text.From(raw), [Format = "dd.MM.yyyy"]) otherwise null, type date), AddEintritt = Table.AddColumn(AddAustritt, "Eintrittsdatum", each let raw = [Eintrittsdatum_Raw] in if raw is date then raw else if raw is datetime then Date.From(raw) else if raw is number then Date.AddDays(#date(1899, 12, 30), Number.RoundDown(raw)) else if (try Number.FromText(Text.From(raw)) otherwise null) <> null then Date.AddDays(#date(1899, 12, 30), Number.RoundDown(Number.FromText(Text.From(raw)))) else try Date.FromText(Text.From(raw), [Format = "dd.MM.yyyy"]) otherwise null, type date), // Verweildauer AddVW = Table.AddColumn(AddEintritt, "Verweildauer_Monate", each try Number.Round(Duration.TotalDays([Austrittsdatum] - [Eintrittsdatum]) / 30.44, 1) otherwise null, type number), // Mitarbeitertyp AddMT = Table.AddColumn(AddVW, "Mitarbeitertyp", each let s = Text.Lower(Text.From(if [Stelle] = null then "" else [Stelle])) in if Text.Contains(s, "praktik") then "Praktikant" else if Text.Contains(s, "werkstudent") then "Werkstudent" else if Text.Contains(s, "aushilfe") then "Aushilfe" else if Text.Contains(s, "lehrling") then "Lehrling" else "Festangestellt", type text), // Fluktuationslogik gemaess HR-Definition aus formeln.docx: // Zaehlen nur Arbeitnehmerkuendigungen von festangestellten Mitarbeitenden. // Nicht zaehlen: Aushilfen, Praktikanten, Werkstudenten, Lehrlinge, // befristete Vertraege, Pensionierungen und Kuendigungen durch Trafag. AddAustrittsartNorm = Table.AddColumn(AddMT, "Austrittsart_Normalisiert", each let raw = Text.Lower(Text.Trim(Text.From(if [Austrittsart] = null then "" else [Austrittsart]))), ae = Text.Replace(raw, Character.FromNumber(228), "ae"), oe = Text.Replace(ae, Character.FromNumber(246), "oe"), ue = Text.Replace(oe, Character.FromNumber(252), "ue"), ss = Text.Replace(ue, Character.FromNumber(223), "ss") in ss, type text), AddIstArbeitnehmerkuendigung = Table.AddColumn(AddAustrittsartNorm, "Ist_Arbeitnehmerkuendigung", each let a = [Austrittsart_Normalisiert] in Text.Contains(a, "arbeitnehmer") or Text.Contains(a, "mitarbeiter") or Text.Contains(a, "kuendigung an") or Text.Contains(a, "an kuendigung") or Text.Contains(a, "eigenkuendigung") or Text.Contains(a, "kuendigung ma") or Text.Contains(a, "kuendigung durch ma"), type logical), AddIstAusgeschlossen = Table.AddColumn(AddIstArbeitnehmerkuendigung, "Ist_Fluktuation_Ausgeschlossen", each let a = [Austrittsart_Normalisiert] in [Mitarbeitertyp] <> "Festangestellt" or Text.Contains(a, "befrist") or Text.Contains(a, "pension") or Text.Contains(a, "rente") or Text.Contains(a, "trafag") or Text.Contains(a, "arbeitgeber") or Text.Contains(a, "ag-kuendigung") or Text.Contains(a, "ag kuendigung") or Text.Contains(a, "kuendigung ag"), type logical), AddFluktuationRelevant = Table.AddColumn(AddIstAusgeschlossen, "Ist_Fluktuationsrelevant", each [Ist_Arbeitnehmerkuendigung] = true and [Ist_Fluktuation_Ausgeschlossen] = false, type logical), AddAusschlussgrund = Table.AddColumn(AddFluktuationRelevant, "Fluktuation_Ausschlussgrund", each let a = [Austrittsart_Normalisiert] in if [Ist_Fluktuationsrelevant] then null else if [Mitarbeitertyp] <> "Festangestellt" then [Mitarbeitertyp] else if Text.Trim(a) = "" then "Austrittsart leer/unklar" else if Text.Contains(a, "befrist") then "Befristeter Vertrag" else if Text.Contains(a, "pension") or Text.Contains(a, "rente") then "Pensionierung" else if Text.Contains(a, "trafag") or Text.Contains(a, "arbeitgeber") or Text.Contains(a, "ag-kuendigung") or Text.Contains(a, "ag kuendigung") or Text.Contains(a, "kuendigung ag") then "Kuendigung durch Trafag" else if [Ist_Arbeitnehmerkuendigung] = false then "Keine Arbeitnehmerkuendigung" else "Ausgeschlossen", type text), AddAM = Table.AddColumn(AddAusschlussgrund, "Austrittsmonat", each Date.StartOfMonth([Austrittsdatum]), type date), AddAJ = Table.AddColumn(AddAM, "Austrittsjahr", each Date.Year([Austrittsdatum]), Int64.Type), AddNN = Table.AddColumn(AddAJ, "Nachname", each Text.Trim(Text.Split(Text.From([Name_Voll]), ","){0}), type text), AddVN = Table.AddColumn(AddNN, "Vorname", each let p = Text.Split(Text.From([Name_Voll]), ",") in if List.Count(p) > 1 then Text.Trim(p{1}) else "", type text), Clean = Table.RemoveColumns(AddVN, {"PERNR_Text", "Austrittsdatum_Raw", "Eintrittsdatum_Raw"}), Reorder = Table.ReorderColumns(Clean, {"Personalnummer"} & List.RemoveItems(Table.ColumnNames(Clean), {"Personalnummer"})) in Reorder