Forum Discussion

WMart_AMS's avatar
WMart_AMS
Frequent Visitor
6 months ago
Solved

Generate a column for dates between start dates (list/ pivot?)

Hi all,   I am looking for a solution in power query  for the following. I have an overview with shipping and return costs per year, country and channel. the costs change every now and then.   m...
  • ralf_anton's avatar
    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.

  • AlienSx's avatar
    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