Group by- Funktion

Hallo Gemeinde!
Ich habe eine Frage zur Group by- Funktion.
Ich greife auf eine Oracle- DB zu. Bei der Ausgabe kommt es zu dem Problem, daß ein Attribut 2 x angezeigt wird, da ich ja nach mehreren Attributen gruppieren muß. In einem dieser Felder ist der Wert nun NULL, weshalb es zu mehrfachen Ausgaben kommt. Ist ja eigentlich auch richtig. Ich möchte aber nur nach einem Attribut gruppieren, was so nach meiner Abfrage nicht möglich ist( nach meinem bisherigen Kenntnisstand).

Meine Abfrage sieht etwa so aus:

select
abc
,def
,hij
,sum(xyz)
from
tabelle
where
bedingung
group by abc,def,hij

Frage: Wie ist es möglich, nur nach einem Attribut zu gruppieren, wenn sich in den anderen beiden z.B. verschiedene Werte befinden bzw. manchmal die Felder NULL sind???
ich darf allerdings nicht auf is not null prüfen, da sonst das Ergebnis verfälscht wird. Gibt es da einen trick?
Danke im Voraus und allen eine schöne (Vor-)Weihnachtszeit.
Gruß
Flons

Ich hoffe, ich konnte mich halbwegs verständlich ausdrücken.

Hallo Florian!

Bei der Ausgabe kommt es zu
dem Problem, daß ein Attribut 2 x angezeigt wird, da ich ja
nach mehreren Attributen gruppieren muß. In einem dieser
Felder ist der Wert nun NULL, weshalb es zu mehrfachen
Ausgaben kommt. Ist ja eigentlich auch richtig.

Du hast es ja bereits erkannt…

Ich möchte
aber nur nach einem Attribut gruppieren, was so nach meiner
Abfrage nicht möglich ist( nach meinem bisherigen
Kenntnisstand).

Das ist deshalb nicht möglich, weil’s unlogisch wäre…

select
abc
,def
,hij
,sum(xyz)
from
tabelle
where
bedingung
group by abc,def,hij

Du suchst also die Summe aller xyz. Dazu hättest du gerne (jeweils!) abc, def und hij angegeben. Wenn diese (also abc, def, hij) gleich sind, dann kann dir SQL auch eine einzige Zeile liefern. Wenn die aber für eine Spalte (die du ja sehen willst, sonst wär’s ja nicht in der Splatenliste) verschieden sind - was soll dann in dieser Spalte angezeigt werden? Jeder beliebige Wert für - sagen wir mal - def wäre falsch, weil es ja auch andere gibt. Beispiel:
Bei

abc | def | hij | xyz
----+-----+-----+----
A | D | H | 1
A | D | H | 2
A | E | H | 3

liefert dein Select

abc | def | hij | SUM
----+-----+-----+----
A | D | H | 3
A | E | H | 3

Wenn du nach def jetzt nicht gruppieren würdest, dann hättest du wohl gerne als Ergebnis

abc | def | hij | SUM
----+-----+-----+----
A | ??? | H | 6

Stellt sich bloss die Frage, was in Spalte „def“ angezeigt werden soll: D? E? NULL? Was anderes?

Auch wenn es da jetzt nur darum gehen sollte einfach die Zeilen rauszufiltern, die nur wegen der NULLs ausgegeben werden ist das Ergebnis eigentlich nicht korrekt, wenn du dir mal diese etwas sprechendere Tabelle vor Augen führst:

Name | Geburtsdatum | Rechnungsbetrag
Hans Huber | 01.01.1971 | 100,00
Hans Huber | | 200,00
Hans Huber | 03.03.1973 | 300,00

Wenn du dir jetzt mal diese (nicht sonderlich gute designte, aber als Beispiel wird’s reichen) Tabelle von Rechnungen ansiehst und die Summe aller Rechnungen für den Herrn Hans Huber ermitteln willst: Sind das jetzt zwei verschiedene oder drei verschiedene Hans Hubers? Wenn’s nur zwei sind - welchem der beiden schlägst du die 200,00 auf?

Ich glaube ja nicht unbedingt, dass dir das jetzt eine Hilfe war, aber hoffen kann man ja noch… :wink:

Liebe Grüße,
Martin

Hallo!

Verfahren 522 T0 T1-T3 T2 T4
48 Aufträge CaO CaC2 MG97 CaO
Modell 4800 22769 3728 1200
Bediener 4800 21254 3730 1325
Ist 4876 21320 3709 1361

So sieht mein Ergebnis (ungefähr) aus.
Ist jetzt T0(Ausgabe = CaO) NULL, würde ja eine neue Ausgabe erzeugt werden:

Verfahren 522 T0 T1-T3 T2 T4
2 Aufträge CaC2 MG97 CaO
Modell 4800 145 145 145
Bediener 4800 145 145 145
Ist 4876 145 145 145

Ich möchte aber erreichen, daß T0 trotzdem in derselben Gruppe ausgegeben wird (ich weiß, ist eigentlich unlogisch bzw. falsch)und die Werte addiert werden( was oben ja auch passiert).

Hallo!
Die einzige Möglichkeit, die ich bisher sehe, ist über den Weg: nvl(t.T0_MAT_MOD,‚Standardeintrag‘);
Allerdings wird der Eintrag in der DB damit ja „verfälscht“.
Ich dachte, vieleicht gibt es noch eine andere Möglichkeit??!!

Hallo!
Die einzige Möglichkeit, die ich bisher sehe, ist über den
Weg: nvl(t.T0_MAT_MOD,‚Standardeintrag‘);
Allerdings wird der Eintrag in der DB damit ja „verfälscht“.
Ich dachte, vieleicht gibt es noch eine andere Möglichkeit??!!

Hallo Florian,

wenn du die GROUP-BY-Klausel unbedingt umbiegen willst:
Selektiere nicht direkt das Attribut T0_MAT_MOD, sondern übergebe an eine Funktion alle Parameter, die nötig sind, um die für die Gruppenstufe distinkten Werte von T0_MAT_MOD zu ermitteln. Diese Werte kannst du dann als String aus der Funktion in den SELECT zurückgeben.

Da diese Funktion dann innerhalb der Gruppenstufe immer den selben String zurückgeben wird, kannst du wie gewünscht gruppieren.

Caveat: Ich hab’s nicht ausprobiert, weiß also nicht, ob die Angabe einer Funktion in der GROUP-BY-Klausel erlaubt ist. Wenn nicht, müsste
eine View vorgeschaltet werden. Außerdem wird es betrübliche Auswirkungen auf die Performanz deiner Abfrage haben.

Grüßt: Guido