Daten mit Umlauten in Power Query wie in Excel sortieren
#21
Nachtrag:

Hier noch ein stark vereinfachtes Beispiel zum Ausprobieren: ab XL2010

.zip   tblData_Sort.zip (Größe: 17,36 KB / Downloads: 6)

Knobbi38
Antworten Top
#22
(11.02.2026, 20:16)knobbi38 schrieb: Nachtrag:

Hier noch ein stark vereinfachtes Beispiel zum Ausprobieren: ab XL2010


Knobbi38

Hallo, warum muss das ein gezipptes Beispiel sein?
Gruß Jörg
stolzes Mitglied im ----Excel-Verein

Im Wort FEHLER steckt auch das Wort HELFER!

FEHLER helfen dir.
Nimm deine FEHLER an und lerne aus ihnen. 
Wenn du es zulässt, dann werden sie dich stärken

Im Wort 
Antworten Top
#23
(11.02.2026, 20:16)knobbi38 schrieb: Hier noch ein stark vereinfachtes Beispiel zum Ausprobieren: ab XL2010

Ja, da bist Du in die gleiche Falle getappt die wir in diesem Thread schon zweimal hatten: Der Comparer "de-DE_phoneb" liefert keine stabile Sortierung.

Wenn Du mehrere Göthe und Goethe hast, dann werden diese per Zufall je nach Anordnung in der Quelle durcheinander ausgegeben. Wenn man das in eine korrekte Reihenfolge bringen will, dann muss man ihn einpacken und ggf. 2mal vergleichen.

.xlsx   tblData_Sort.xlsx (Größe: 24,46 KB / Downloads: 7)

Andreas.
Antworten Top
#24
Zitat:Der Comparer "de-DE_phoneb" liefert keine stabile Sortierung.

Ich denke, dieses Aussage ist nicht korrekt. 

Vielmehr liegt es daran, das die PQ-Engine die Schrittfolge optimiert, damit aber tlws. falsche Ergebnisse produziert. Durch das vorherige einfügen eines Index, oder das Covern der Sortierung durch Table.Buffer, wird das vermieden. Laut Ken Puls kann es vorkommen, dass beide Maßnahmen notwendig sind.

Mir ist es in solchen Fällen sogar schon passiert, dass wenn ich die Schritte einzeln durchgehe, um die Ergebnisse zu kontrollieren, mir alles richtig angezeigt wird und das Problem nur auftritt, wenn die Abfrage von außen aktualisiert wird. Da war ich vor Jahren froh, als die KI noch nicht helfen konnte, dass Ken das Problem kannte und mir mit seinen Tipps helfen konnte.
[-] Folgende(r) 1 Nutzer sagt Danke an ws-53 für diesen Beitrag:
  • Kuwer
Antworten Top
#25
Jockel schrieb:Hallo, warum muss das ein gezipptes Beispiel sein?

Warum nicht?
Antworten Top
#26
(12.02.2026, 12:13)ws-53 schrieb: Vielmehr liegt es daran, das die PQ-Engine die Schrittfolge optimiert, damit aber tlws. falsche Ergebnisse produziert. 

Ja, das Sortierungsproblem ist mir bekannt, aber in diesem Fall kommt das nicht zum Tragen: Stell in Windows die Sortierung auf Telefonbuch und sortiere mit Excel => gleiches Problem.
(Hatte ich das nicht auch schon gesagt? ... Denke schon.)

Andreas.
Antworten Top
#27
Nachtrag zu #21

Hier noch die beiden Ergänzungen mit Buffer und Index, damit mal damit auch ein wenig spielen kann:

.zip   tblData_Sort_1.zip (Größe: 21,72 KB / Downloads: 3)

Knobbi38

PS:
Im Beispiel von Andreas (#23) wird der PowerQuery-Code leider nicht mehr in XL2010 angezeigt - Kompatibilitätswarnung!
Antworten Top
#28
(12.02.2026, 13:30)knobbi38 schrieb: Hier noch die beiden Ergänzungen mit Buffer und Index, damit mal damit auch ein wenig spielen kann:
Ja, ist immer noch falsch:
   

Hier die Datei:

.xlsx   tblData_Sort_1.xlsx (Größe: 25,42 KB / Downloads: 4)

Und hier der Comparer den Du mit Deinem Excel 2010 nicht siehst:
Code:
// ComparerDIN5007_2
let func = (optional ignoreCase as nullable logical) as function =>
  let
    ic = ignoreCase ?? false,
    baseComparer = if ic then Comparer.OrdinalIgnoreCase else Comparer.Ordinal,
    comparer = (x as nullable text, y as nullable text) as number =>
      let
        res = Comparer.FromCulture("de-DE_phoneb", ic)(x, y)
      in
        if res=0 then baseComparer(x, y) else res
  in
    comparer,
documentation = [
  Documentation.Name =  "ComparerDIN5007_2",
  Documentation.Description = "Comparer to perform a stable sort as described in DIN 5007-2",
  Documentation.LongDescription = Documentation.Description,
  Documentation.Category = "Table",
  Documentation.Source = "andreas.killer@gmx.net",
  Documentation.Version = "1.1",
  Documentation.Author = "Andreas Killer",
  Documentation.Examples = {[
    Description = "",
    Code = "
= Table.Sort(Source, (x, y) => ComparerDIN5007_2(false)(x[Land], y[Land]))
or
= TableComparerSort(Source,{{""Land"", Order.Ascending, ComparerDIN5007_2(false)}})

ignoreCase: To ignore the spelling or not.
The default value for ignoreCase is false.
",
    Result = ""]}]
in 
  Value.ReplaceType(func, Value.ReplaceMetadata(Value.Type(func), documentation))


Statt
  = Table.Sort( Indexed, (x,y) => Comparer.FromCulture("de-DE_phoneb", false)(x[Nachname], y[Nachname]))
dies
  = Table.Sort( Indexed, (x,y) => ComparerDIN5007_2 ()(x[Nachname], y[Nachname]))
verwenden.

Ich weiß nicht ob Deine Power Query Version die documentation schon kann, wenn nicht dann schnibbel Dir die paar Zeilen relevanten Code einfach raus. Oder mach es anders nach. Smile

Andreas.
Antworten Top
#29
Deine 3 Beispiele der de-DE_phoneb-Sortierung zeigen bei mir identische Sortierfolgen. Das spricht dann wieder eher für meine Aussage. Denn in den 3 Beispielen gibt es ja für PQ keinen Grund die Schrittfolgen zu optimieren. Somit werden auch ohne Index und Table.Buffer bei mir immer das gleiche Sortierergebnis angezeigt.

Aber hier noch eine Methode, habe ich mir vom Copilot basteln lassen, wie: "Comparer.FromCulture("de-DE_phoneb", false)" auch für das gruppieren verwendet werden kann.

Code:
let
    Quelle = Excel.CurrentWorkbook(){[Name="Quelle"]}[Content],
    #"Geänderter Typ" = Table.TransformColumnTypes(
        Quelle,
        {{"ID", Int64.Type}, {"Vorname", type text}, {"Nachname", type text}}
    ),
    Sortiert = Table.Sort( #"Geänderter Typ", (x,y) => Comparer.FromCulture("de-DE_phoneb", false)(x[Nachname], y[Nachname])),

//let
    Compare = Comparer.FromCulture("de-DE_phoneb", false),
    DistinctNames = List.Buffer(List.Distinct(Sortiert[Nachname])),
    AddGroupKey =
        Table.AddColumn(
            Sortiert,
            "GroupKey",
            (r) =>
                let
                    current = r[Nachname],
                    rep =
                        List.First(
                            List.Select(
                                DistinctNames,
                                (n) => Compare(current, n) = 0
                            )
                        )
                in
                    rep,
            type text
        ),
    Grouped = Table.Group(AddGroupKey, {"GroupKey"}, {{"Rows", each _, type table}}        ),
    #"Expanded {0}" = Table.ExpandTableColumn(Grouped, "Rows", {"ID", "Vorname", "Nachname"}, {"ID", "Vorname", "Nachname"})
in
    #"Expanded {0}"
Antworten Top
#30
(13.02.2026, 14:12)ws-53 schrieb: Aber hier noch eine Methode, habe ich mir vom Copilot basteln lassen, wie: "Comparer.FromCulture("de-DE_phoneb", false)" auch für das gruppieren verwendet werden kann.
Und da meinst Du das ist besser?  Dodgy  Ich habe auch div. Code von den KI's generieren lassen, IMHO alles Schrott.

Noch ein Nachtrag zu dem Comparer.FromCulture, das Ding ist großer Mist. Man könnte ja auf die Idee kommen das man einfach mal mit de-AT sortieren könnte um die österreichische Sortierung zu bekommen, oder mal mit en-US oder irgendeine andere Sprache.

Pustekuchen! Man kann auch Comparer.FromCulture("xx-yy", false) sortieren, keine Fehlermeldung und da kommt der gleiche Blödsinn bei raus.

Andreas.
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste