Gruppiert vs nicht gruppiert: verschiedene Summen

kirilb

Benutzer
Beiträge
14
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?
 
Werbung:
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.
 
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.
 
Werbung:
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.
 
Zurück
Oben