Forum Discussion
Generate a column for dates between start dates (list/ pivot?)
- 6 months ago
Hi,
ich hoffe, die Datenqualität ist im Original besser...;)
So wie ich das verstanden habe, könntest Du das folgendermaßen lösen:
Abfrage 1: Alle Versandkosten:
M-Code:
let Quelle = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content], Tarifspalten = Table.ColumnNames(Quelle), #"Entfernte oberste Elemente" = List.Skip(Tarifspalten,2), #"In Tabelle konvertiert" = Table.FromList(#"Entfernte oberste Elemente", Splitter.SplitTextByDelimiter(" "), null, null, ExtraValues.Error), #"Gefilterte Zeilen" = Table.SelectRows(#"In Tabelle konvertiert", each ([Column1] = "Rückgabekosten")), ColToDel = Table.AddColumn(#"Gefilterte Zeilen", "Relevant", each [Column1] & " " & [Column2])[Relevant], #"Entfernte Spalten" = Table.RemoveColumns(Quelle,ColToDel), #"Entpivotierte Spalten" = Table.UnpivotOtherColumns(#"Entfernte Spalten", {"CountryID", "Kanal"}, "Attribut", "Wert"), #"Spalte nach Trennzeichen teilen" = Table.SplitColumn(#"Entpivotierte Spalten", "Attribut", Splitter.SplitTextByDelimiter(" ", QuoteStyle.Csv), {"Tarif", "Datum"}) in #"Spalte nach Trennzeichen teilen"Abfrage 2: Alle Rückgaben, an die die Versanddaten angehängt werden. (Natürlich kann man das auch in einer Abfrage erledigen, aber so wird es hoffentlich klarer)
M-Code:
let Quelle = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content], Tarifspalten = Table.ColumnNames(Quelle), #"Entfernte oberste Elemente" = List.Skip(Tarifspalten,2), #"In Tabelle konvertiert" = Table.FromList(#"Entfernte oberste Elemente", Splitter.SplitTextByDelimiter(" "), null, null, ExtraValues.Error), #"Gefilterte Zeilen" = Table.SelectRows(#"In Tabelle konvertiert", each ([Column1] = "Versandkosten")), ColToDel = Table.AddColumn(#"Gefilterte Zeilen", "Relevant", each [Column1] & " " & [Column2])[Relevant], #"Entfernte Spalten" = Table.RemoveColumns(Quelle,ColToDel), #"Entpivotierte Spalten" = Table.UnpivotOtherColumns(#"Entfernte Spalten", {"CountryID", "Kanal"}, "Attribut", "Wert"), #"Spalte nach Trennzeichen teilen" = Table.SplitColumn(#"Entpivotierte Spalten", "Attribut", Splitter.SplitTextByDelimiter(" ", QuoteStyle.Csv), {"Tarif", "Datum"}), #"Angefügte Abfrage" = Table.Combine({#"Spalte nach Trennzeichen teilen", TarifVersand}) in #"Angefügte Abfrage"Hier kannst Du die Beispieldatei herunterladen.
- 6 months ago
let fx_dates = (s, e) => List.Generate(() => s, (x) => x < e, (x) => Date.AddMonths(x, 1)), Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content], eff_dates = List.Buffer( List.Sort( List.Distinct( List.Transform( List.Skip(Table.ColumnNames(Source), 2), (x) => Date.From(Text.AfterDelimiter(x, "cost "), "de") ) ) ) & {Date.StartOfMonth(Date.AddMonths(Date.From(DateTime.LocalNow()), 2))} ), all_dates = List.Buffer( List.Transform( List.RemoveLastN(List.Positions(eff_dates)), (x) => fx_dates(eff_dates{x}, eff_dates{x + 1}) ) ), upvt = Table.UnpivotOtherColumns(Source, {"CountryID", "Channel"}, "Attribute", "Tarif"), split = Table.SplitColumn(upvt, "Attribute", Splitter.SplitTextByDelimiter(" cost "), {"Cost type", "Date"}), tx = Table.TransformColumns( split, { {"Date", (x) => all_dates{List.PositionOf(eff_dates, Date.From(x, "de"))}}, {"Tarif", (x) => Value.FromText(x, "de")} } ), z = Table.ExpandListColumn(tx, "Date") in z
Answer :
M Query :
let
Source = Excel.Workbook(File.Contents(Your file\Q2.xlsx"), null, true),
Sheet1_Sheet = Source{[Item="Sheet1",Kind="Sheet"]}[Data],
// Standard headers step
#"Promoted Headers" = Table.PromoteHeaders(Sheet1_Sheet, [PromoteAllScalars=true]),
#"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"CountryID", type text}, {"Channel", type text}}),
// Unpivoting the cost columns because they are wide
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"CountryID", "Channel"}, "Cost Info", "Tarif"),
#"Split Column by Delimiter" = Table.SplitColumn(#"Unpivoted Other Columns", "Cost Info", Splitter.SplitTextByEachDelimiter({" ("}, QuoteStyle.Csv, false), {"Cost Type", "Start Date"}),
// Fix the date format - the brackets were annoying
#"Added Custom" = Table.TransformColumns(#"Split Column by Delimiter", {{"Start Date", each Date.FromText(Text.BeforeDelimiter(_, ")")), type date}}),
#"Sorted Rows" = Table.Sort(#"Added Custom",{{"CountryID", Order.Ascending}, {"Channel", Order.Ascending}, {"Cost Type", Order.Ascending}, {"Start Date", Order.Ascending}}),
// Doing the grouping to get the end dates
#"Grouped Rows" = Table.Group(#"Sorted Rows", {"CountryID", "Channel", "Cost Type"}, {{"Rows", each
let
Idx = Table.AddIndexColumn(_, "Index", 0, 1),
NextDate = Table.AddColumn(Idx, "End Date", each try Idx[Start Date]{[Index] + 1} otherwise #date(2026, 12, 31), type date)
in
NextDate}}),
#"Expanded Rows" = Table.ExpandTableColumn(#"Grouped Rows", "Rows", {"Start Date", "End Date", "Tarif"}),
// Generate the months list
#"Added Custom1" = Table.AddColumn(#"Expanded Rows", "Month", each List.Generate(() => [Start Date], (d) => d < [End Date], (d) => Date.AddMonths(d, 1))),
#"Expanded Month" = Table.ExpandListColumn(#"Added Custom1", "Month"),
#"Renamed Columns" = Table.RenameColumns(#"Expanded Month",{{"CountryID", "Country"}}),
// Cleaning up columns at the end
#"Removed Columns" = Table.SelectColumns(#"Renamed Columns",{"Country", "Channel", "Cost Type", "Month", "Tarif"}),
#"Final Type Check" = Table.TransformColumnTypes(#"Removed Columns",{{"Tarif", type number}, {"Month", type date}})
in
#"Final Type Check"