Seite 1 von 1

Fehler mit GROUP BY - Abfrage

Verfasst: Fr, 09.10.2009 22:15
von Niels
Im weiterem Knobeln über dieses Problem habe ich mich mal etwas an Base heran gewagt. Leider nur bedingt erfolgreich.
Ich habe auf meine Testdaten einen View generiert, der die Daten sortiert aufbereitet. Nun wollte ich aus diesem View mittels GROUP BY über einen weiteren View die doppelte Einträge filtern:

Code: Alles auswählen

SELECT * FROM "Sortiert" GROUP BY "Lage"
Leider gibt es hier eine Fehlermeldung:

Code: Alles auswählen

SQL-Status: 37000
Fehler-Code: -67

Not in aggregate function or group by clause: org.hsqldb.Expression@198dc19 in statement [SELECT * FROM "Sortiert" GROUP BY "Lage"]
Eigentlich habe ich keine Aggregatfunktion in dem Query, allerdings in dem View, auf den ich zugreife, also habe ich den Query direkt auf meine Tabelle Import gesetzt, leider mit dem gleichen Ergebnis.
Was sagt mir dies nun?

Niels

Re: Fehler mit GROUP BY - Abfrage

Verfasst: Fr, 09.10.2009 23:17
von Barlee
Hallo Niels,
doppelte Einträge filtern
Das erreichst Du mit SELECT DISTINCT * FROM ...

----
Zur Info: Die Meldung

Code: Alles auswählen

Not in aggregate function or group by clause: ...
besagt, dass eine Aggregatfunktion vermisst wird (dazu zählen z.B. SUM(), COUNT(), AVG())

Gruß Barlee

Re: Fehler mit GROUP BY - Abfrage

Verfasst: Mo, 12.10.2009 11:49
von Niels
Hallo Barlee,

Danke für Deinen Input.
Barlee hat geschrieben:
doppelte Einträge filtern
Das erreichst Du mit SELECT DISTINCT * FROM ...
Nicht ganz, denn DISTINCT * vergleicht den ganzen Datensatz und so habe ich in der Abfrage wieder alle Daten. Ich brauche jedoch keine doppelten Werte in der Spalte Lage, wobei hier immer der Datensatz genommen werden muss, der den kleinsten TSI hat. Nun kann ich vielleicht ein DISTINCT "Lage" machen, dann bekomme ich nur die Lagen. Nun könnte ich mit einer JOIN-Abfrage wieder die restlichen Werte in einem weiteren View dazu basteln. Erschwerend kommt dazu, dass der Wert TSI auch leer sein kann, aber der leere Wert als größter TSI zu werten ist. Die Standard-Sortierung nimmt ihn erst einmal als Kleinsten.
Meine Internetrecherche zeigte, dass immer wieder empfohlen wird, den DISTINCT zu umgehen
Barlee hat geschrieben:Zur Info: Die Meldung

Code: Alles auswählen

Not in aggregate function or group by clause: ...
besagt, dass eine Aggregatfunktion vermisst wird (dazu zählen z.B. SUM(), COUNT(), AVG())
Sagt mir das also, dass ich GROUP BY nur mit Aggregat-Funktionen verwenden kann :shock:

Niels

Re: Fehler mit GROUP BY - Abfrage

Verfasst: Mo, 12.10.2009 13:19
von Barlee
Hallo Niels,

Ausgehend von Deiner Calc-Tabelle soltest Du so die richtigen Datensätze selektieren können.
Ggf joinst Du noch weitere Spalten hinzu.

Code: Alles auswählen

SELECT Code, MIN(Lage) AS MIN_TSI FROM Deine_Tabelle GROUP BY Code
Code z.B. 1-1-23-15, Lage z.B. 3, <NULL> usw.

Ist es das, was Du suchst?

Gruß Barlee

Re: Fehler mit GROUP BY - Abfrage

Verfasst: Mo, 12.10.2009 14:18
von Niels
Hi Barlee,
Barlee hat geschrieben:Ist es das, was Du suchst?
Jo, fast! Ich habe da jetzt ein

Code: Alles auswählen

SELECT "Lage", MIN( "Lage" ) AS "MIN_Lage" FROM "Import" AS "Import" GROUP BY "Lage"
erfolgreich getestet. Nun möchte ich jedoch wieder alle Spalten haben. Ein

Code: Alles auswählen

SELECT "Lage", "TSI", MIN( "Lage" ) AS "Min_Lage" FROM "Import" AS "Import" GROUP BY "Lage"
enthält wieder keine Aggregat-Funktion :evil:

Niels

Re: Fehler mit GROUP BY - Abfrage

Verfasst: Mo, 12.10.2009 14:26
von Barlee
Hallo Niels,
enthält wieder keine Aggregat-Funktion
Korrekt, denn

Code: Alles auswählen

GROUP BY "Lage"
muss

Code: Alles auswählen

GROUP BY "Lage", "TSI"
heissen.

Gruß Barlee

Re: Fehler mit GROUP BY - Abfrage

Verfasst: Mo, 12.10.2009 16:10
von Niels
Schade, die originale Tabelle enthält doch ein par mehr Spalten :?
Aber mit

Code: Alles auswählen

SELECT MIN( "Lage" ) AS "Min_Lage", "TSI" FROM "Import" AS "Import" GROUP BY "Lage", "TSI"
bin ich schon einen Schritt weiter. Allerdings wird nicht unbedingt der Record mit dem kleinsten TSI/Lage gegriffen, sondern wieder alle, weil die TSI's ja unterschiedlich sind.
Ich habe mal kurz in MySQL getestet, da geht auch

Code: Alles auswählen

select * from table group by SpalteX
Niels