Bemærk
Dette er en af en række artikler, der beskriver løsninger sendt til Podcast 2316-udfordringen.
I min løsning til omformning af dataene ønskede jeg en måde at se, om en kolonne indeholdt et medarbejdernavn eller en værdi som Q1, Q2, Q3, Q4. I min løsning antog jeg, at ingen ville have et navn med 2 tegn, og så tilføjede jeg en kolonne for at beregne længden af teksten i kolonnen.
Jason M undgik behovet for kolonnen Længde ved at tilføje tre andre hvis klausuler til hans betingede kolonne.
Den betingede beregning for medarbejder ser derefter ud til, at kvartal er nul: hvis (kvartal) = null, så (kategoribeskrivelse) ellers null.
Her er Jasons M-kode:
let Source = Excel.CurrentWorkbook()((Name="UglyData"))(Content), #"Transposed Table" = Table.Transpose(Source), #"Promoted Headers" = Table.PromoteHeaders(#"Transposed Table", (PromoteAllScalars=true)), #"Added Conditional Column" = Table.AddColumn(#"Promoted Headers", "Quarter", each if (Category Description) = "Q1" then (Category Description) else if (Category Description) = "Q2" then (Category Description) else if (Category Description) = "Q3" then (Category Description) else if (Category Description) = "Q4" then (Category Description) else null), #"Added Conditional Column1" = Table.AddColumn(#"Added Conditional Column", "Employee", each if (Quarter) = null then (Category Description) else null), #"Filled Up" = Table.FillUp(#"Added Conditional Column1",("Quarter")), #"Filled Down" = Table.FillDown(#"Filled Up",("Employee")), #"Inserted Distinct Count" = Table.AddColumn(#"Filled Down", "Distinct Count", each List.NonNullCount(List.Distinct(((Category Description), (Employee)))), Int64.Type), #"Filtered Rows1" = Table.SelectRows(#"Inserted Distinct Count", each (Distinct Count) 1), #"Removed Columns1" = Table.RemoveColumns(#"Filtered Rows1",("Distinct Count")), #"Removed Columns" = Table.RemoveColumns(#"Removed Columns1",("Category Description")), #"Filtered Rows" = Table.SelectRows(#"Removed Columns", each ((Employee) "Dept. Total")), #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Filtered Rows", ("Quarter", "Employee"), "Attribute", "Value"), #"Renamed Columns" = Table.RenameColumns(#"Unpivoted Other Columns",(("Attribute", "Category Description"))), #"Pivoted Column" = Table.Pivot(#"Renamed Columns", List.Distinct(#"Renamed Columns"(Quarter)), "Quarter", "Value"), #"Inserted Sum" = Table.AddColumn(#"Pivoted Column", "Total", each List.Sum(((Q1), (Q2), (Q3), (Q4))), type number), #"Reordered Columns" = Table.ReorderColumns(#"Inserted Sum",("Category Description", "Employee", "Q1", "Q2", "Q3", "Q4", "Total")) in #"Reordered Columns"
Ondřej Malinský sendte en løsning ind, der også anvendte flere Else If-klausuler:
Matthew Wykle sendte en løsning med endnu en måde at identificere kvartererne på. Hans metode kontrollerer både, at teksten starter med Q, og at det andet ciffer er mindre end 5:
if Text.Start((Attribute),1)="Q" and Number.From(Text.Middle((Attribute),1,1))<5 then Text.Start((Attribute),2) else "Total")
Christian Neuberger brugte denne formel til at få medarbejdernavn, udfyldt og derefter filtreret kolonne 1 for kun at omfatte Q1, Q2, Q3 eller Q4. Oz Du Soleil brugte også denne metode.
Excel MVP Ken Puls vinder sandsynligvis med sin formel. Det ser efter en understregning for at vide, om dette ikke er medarbejdernavnet.
Se Ken's fulde løsning på Excel MVP'er Attack the Data Cleansing Problem in Power Query.
Gå tilbage til hovedsiden for Podcast 2316-udfordringen.
Læs den næste artikel i denne serie: Power Query: Dealing with Multiple Identical Headers.