Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Gruppiert vs nicht gruppiert: verschiedene Summen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von kirilb, 3 Juli 2014.

  1. kirilb

    kirilb Benutzer

    Hallo zusammen
    ich habe eine Aufgabe, eine historisch gewaschsene, ellenlange (40K Zeichen) Abfrage zu überarbeiten und zu verschlanken. Darunter ist eine einzige Zahl (fact), der Rest sind Dimmensionen. Wenn ich die neue (schlanke) und die alte Variante laufen lasse, dann bekomme ich geringfügig andere Summe für das fact-Feld. Um leichter vergleichen zu können, habe ich den where Teil exact gleich bei den beiden belassen. Was sich aber unterscheidet ist der select und der group by. Bei der neuen Lösung fehlt group by komplett.
    Bevor ich mich ins Nirvana begebe und Zeile für Zeile abgleiche, rein theoretisch die Frage: Wie kann sich das Ergebnis einer Afrage unterscheiden, wenn der Filter, also where Teil, gleich sind? N.B. im group by sind gefühlte 10K "case when" statements, die oft dieselbe Felder verwenden und ähnliche Logiken erstellen. Kann es sein, dass dadruch es zu einer Doppelzählung nach alt kommt?
     
  2. ukulele

    ukulele Datenbank-Guru

    Deine Frage ist sehr schwammig, ungefähr was kann bei meinem Auto kaputt gehen...

    Eine CASE Schleife kann niemals die Anzahl der Rückgabewerte verändern. Bei nur einem Rückgabewert hilft dir das natürlich herzlich wenig :) Wenn die CASE Schleifen diesen Wert berechnen haben sie natürlich unmittelbaren Einfluss.
     
  3. kirilb

    kirilb Benutzer

    ok, hier ein Beispiel nach neu:
    select
    Jahr,
    Zahl
    from A
    where
    GleicheBedingung​

    Beispiel nach alt
    select
    max(Jahr),
    sum(Zahl)
    from A
    where
    GleicheBedingung
    group by
    case when1,
    bis ca
    case when100000

    Die Schleifen verwenden die Zahl nie und berechnen die Zahl nicht, sondern das ist ein Wert, der direkt aus der DB kommt.
     
  4. ukulele

    ukulele Datenbank-Guru

    Nun CASE im GROUP BY bestimmt ja, wann Werte zusammen gefasst werden. Über die Agregatfunktionen max() und sum() werden dann Werte aggregiert. Ich vermute mal das max() einen klaren Unterschied macht da ja aus einer Menge A ein Wert X ermittelt wird. Änderst du jetzt die Menge in B kann es ja sein das Wert X höher oder niedriger ist, also hat dein CASE einen Einfluss.

    Wenn hier jetzt nur eine Zeile zurück geliefert wird müsste man das GROUP BY auch komplett auflösen können und zu einem WHERE umformulieren können.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden