ORACLE SQL Befehl Probleme mit GROUP BY

mafin

Mitglied
Hallo,

ich habe folgenden SQL Befehl:
Code:
SELECT gezlizenzen.produkt, gezlizenzen.rechner, gezlizenzen.benutzer AS HAUPTBENUTZERID, benutzer.benutzer AS HAUPTBENUTZER, SUM(TO_NUMBER (TO_CHAR (gezlizenzen.endzeit, 'SSSSS')) - TO_NUMBER (TO_CHAR (gezlizenzen.startzeit, 'SSSSS'))) AS ZEIT
FROM gezlizenzen, benutzer
WHERE gezlizenzen.benutzer = benutzer.benutzerid AND gezlizenzen.endzeit > TO_TIMESTAMP(SYSDATE-8, 'dd.mm.yy')
GROUP BY produkt, rechner, gezlizenzen.benutzer, benutzer.benutzer
ORDER BY produkt, SUM(TO_NUMBER (TO_CHAR (gezlizenzen.endzeit, 'SSSSS')) - TO_NUMBER (TO_CHAR (gezlizenzen.startzeit, 'SSSSS'))) DESC

Dieser Befehl gibt mir folgendes aus:
Code:
CT5 B**5    sc**mi	Mi**dt	41572
CT5 B**5    di**to	To**ov	18944
HD2 p**8	di**to	To**ov	26144
HD2 B**5	sc**mi	Mi**dt	24084

Nun soll aber nach Rechner gruppiert werden. D.h. nicht nach Name. Aber sobald ich "gezlizenzen.benutzer, benutzer.benutzer" hinter group by weglasse bekomme ich einen group by Fehler. Jedoch soll die beiden ersten Zeilen der Ausgabe zusammenfassen. Denn dort ist zwar ein anderer Benutzer aber der gleiche Rechner mit der gleichen Lizenz. Hier geht es nur um die Rechner, aber ein Benutzer soll schon angegeben sein. Geht das?
 
Ohne auf dein Statement näher einzugehen versuche ich mal einen allgemeinen Versuch zur Erläuterung der GROUP BY Klausel. Dabei ist zu beachten, dass sich meine Aussagen auf ANSI SQL bzw. auf Oracle beschränken. Manche Datenbanksysteme wie z.B. mySQL nehmen gewisse Dinge nicht so genau und erlauben daher eine Syntax die nicht korrekt ist und m.E. unvorhersehbare Ergebnisse in sich birgt.

Die GROUP BY Klausel ist eine der letzen Operationen einer SQL Anweisung die von einem Datenbanksystem ausgeführt wird, d.h. zuerst werden die einzelnen Zeilen auf Basis der WHERE Klausel oder eines JOINS gefiltert. Beide Statements verringern in der Regel die Anzahl der zurückgelieferten Zeilen, der Unterschied ist jedoch entscheidend: Während bei WHERE die Zeilen komplett aus der Ergebnismenge gefiltert werden, fließen beim GROUP BY alle Zeilen ein und verändern das Ergebnis.

Das Ziel einer GROUP BY Klausel ist die Zusammenfassung mehrerer Zeilen anhand einer gleichen Eigenschaft. Dadurch, dass also eine Zeile im späteren Ergebnis durch mehrere Zeilen repräsentiert wird muss eine Spalte die im Ergebnis dargestellt wird einer der zwei Eigenschaften erfüllen:
1.) Sie muss in allen Zeilen die diese Gruppe bilden gleich sein, und somit in der GROUP BY Klausel auftauchen.
2.) oder sie muss eine Aggregationsfunktion sein, d.h. eine Funktion die den Wert mehrerer Zeilen aufnimmt und einen einzigen dafür zurückliefert. Klassische Beispiele sind hier SUM(), MAX() oder AVG().

Andere Spalten können niemals in der Spaltenliste eines SELECTs mit GROUP BY Klauses stehen! Und warum?
Natürlich weil die Datenbank nicht wüsste welchen der Werte sie nun als den "gruppierten" Wert der Gruppe anzeigen soll.

nun zu deinem Problem:

1.) Entweder du lässt die Spalte Benutzer raus
2.) Du gruppierst nach Benutzer
3.) oder du suchst eine Aggregationsfunktion, die dir den gewünschten Benutzer aus der Gruppe liefert.

Carsten Czarski von Oracle hat dazu mal was in seinem Bog geschrieben:
http://sql-plsql-de.blogspot.com/2007/03/group-by-wird-zusammen-mit.html
 
Zurück