AVG / Group By Problem
FireGlow
- datenbank
Guten Tag!
Ich verwende Postgres (neueste Version) als Datenbanksystem.
Leider muss ich etwas ausholen um mein Problem zu schildern!
Es geht um folgende 2 Tabellen:
ims_item : (beinhaltet alle Items)
------------------
item_id,
item_typ,
....
ims_statistic : (beinhaltet mehrere Eintraege (oder keine) zu einem Item )
------------------
object_identifier, (=item_id)
trennschaerfe,
diff_occ,
...
Zusätzlich benutze ich noch 2 Tabellen, die für die Itemauswahl nötig, aber nicht weiter relevant für die Problemstellung sind:
ims_ritemdomain und ims_ritemoperator.
Ich brauche nun einen SELECT-Befehl der mir alle Items nach gewünschten Anforderung (ritemdomain/ritemoperator) mit den Durchschnitten (AVG) der vohandenen trennschaerfe und diff_occ holt.
Derzeit habe ich eine Lösung mit 2 SELECT-Befehlen. Ich würde aber gerne meine Auswahl nach den beiden Statistikwerten sortieren, was leider nicht im nachhinein geschehen darf.
Nun mein SQL-Befehl:
SELECT i.item_id,..., AVG(trennschaerfe) AS trennschaerfe, AVG(diff_occ) AS diff_occ
FROM ims_item i INNER JOIN ims_ritemdomain rid ON (...)
INNER JOIN ims_ritemoperator rio ON (...)
LEFT OUTER JOIN ims_statistic s ON (s.object_identifier=i.item_id)
ORDER BY trennschaerfe DESC
Dieser produziert folgenden Fehler:
FEHLER: Spalte »i.item_id« muss in der GROUP-BY-Klausel erscheinen
Kann ich anders an die Problmstellung gehen oder ist nen Fehle im SQL-Befehl?
Ich habe schon an eine Postgres-Funktion gedacht die mir den Durchschnitt liefert, würde das funktionieren ?
yo,
FEHLER: Spalte »i.item_id« muss in der GROUP-BY-Klausel erscheinen
sei froh, das du nicht mysql benutzt, das dbms würde dann nämlich erst gar keine fehlermeldung liefern. grundsätzlich gilt, das du nur spalten in einer gruppierung in der projektion ausgeben kannst, die entweder eine agregat-funktion sind oder eben in der group by klausel stehen, waas bei dir aber nicht der fall ist und zum fehler führt.
da wird aber durch deine ..... schreibweise aber nicht alle spalten sehen können, die du ausgeben willst, macht es eine lösung schwierieger. auf den ersten blick würde ich sagen, solltest du nach der i.tem_id gruppieren und nicht nach der trennschaerfe.
Ilja
da wird aber durch deine ..... schreibweise aber nicht alle spalten sehen können, die du ausgeben willst, macht es eine lösung schwierieger. auf den ersten blick würde ich sagen, solltest du nach der i.tem_id gruppieren und nicht nach der trennschaerfe.
Der komplette Befehl lautet so:
SELECT i.item_id,i.item_id, i.item_typ, i.item_published, i.review_status, i.item_shortText, i.item_status, AVG(trennschaerfe) AS trennschaerfe, AVG(diff_occ) AS diff_occ
FROM ims_item i INNER JOIN ims_ritemdomain rid ON (...)
INNER JOIN ims_ritemoperator rio ON (...)
LEFT OUTER JOIN ims_statistic s ON (s.object_identifier=i.item_id)
ORDER BY trennschaerfe DESC
Wenn ich diesen nun um GROUP BY i.item_id erweitere kommt als Fehlermeldung:
FEHLER: Spalte »i.item_typ« muss in der GROUP-BY-Klausel erscheinen
Wonach ich ja jetzt net nochmal gruppieren sollte, oder? Bzw. dann möchte er bestimmt alle Spalten drin haben.
yo,
Wonach ich ja jetzt net nochmal gruppieren sollte, oder? Bzw. dann möchte er bestimmt alle Spalten drin haben.
doch, genau das solltest du in deinem falle tun. wie bereits gesagt, spalten die keine agregat-funktion können in einer gruppierung nur dann ausgegeben werden, wenn sie auch bestandteil der gruppierung sind. sicherlich kannm an nun nicht beliebig gruppieren, aber in deinem falle geht das, srpich da du sowieso über den eindeutigen schlüssel der item tabelle gruppierst, nimm eingfach zusätzlich alle spalten der item tabelle mit in die gruppierung, die du auch in der abfrage mit ausgeben willst.
Ilja