select distinct und order by

Fragen und Probleme rund um die Abfragespache SQL.
Antworten
Hanno
Benutzer
Beiträge: 72
Registriert: Do 21. Jan 2010, 15:19

select distinct und order by

Beitrag von Hanno »

hallo forum,

Heute habe ich eine Frage zu einer aggregation in einer SQL-Abfrage. ich hoffe jemand kann mir helfen? Ich habe folgende Abfrage:

SELECT
spezies.id_spezies,
akzessionen.id_akzession,
string_agg(distinct bluetezeiten.monat, ';' order by bluetezeiten.id_bluetezeit) AS bluetezeit
FROM akzessionen
INNER JOIN spezies ON (akzessionen.id_spezies = spezies.id_spezies)
LEFT OUTER JOIN verkn_lebensbereiche_spezies ON (verkn_lebensbereiche_spezies.id_spezies = spezies.id_spezies)
LEFT OUTER JOIN verkn_bluetezeiten_spezies ON (verkn_bluetezeiten_spezies.id_spezies = spezies.id_spezies)
LEFT OUTER JOIN bluetezeiten ON (verkn_bluetezeiten_spezies.id_bluetezeit = bluetezeiten.id_bluetezeit)
GROUP BY
akzessionen.id_akzession,
spezies.id_spezies

In der string_agg Funktion möchte ich Monate in einer Zeile hintereinander anzeigen getrennt durch ein Semikolon. Das funktioniert auch soweit ganz gut. Jetzt werden allerdings die Monate immer pro Spezies angezeigt. ich habe also doppelte Werte. Diese kann ich dann durch das distinct ausschliessen. Bis dahin funktioniert das auch noch gut. Jetzt werden allerdings die Monate immer alphabethisch angezeigt. Also August vor Januar usw. Das habe ich jetzt versucht durch das order by zu Lösen, aber leider geht das nicht. Es kommt immer die Fehlermeldung: " in einer Aggregatfunktion mit DISTINCT müssen ORDER-BY-Ausdrücke in der Argumentliste erscheinen". Leider weiss ich jetzt nicht was das bedeutet. Kann mir eventuell jemand helfen und mir einen Tipp geben wie ich die Monate ohne doppelte Werte und sortiert nach der id der monate ausgeben kann?

Vielen herzlichen Dank
hanno

akretschmer
Erfahrener Benutzer
Beiträge: 7714
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: select distinct und order by

Beitrag von akretschmer »

Vereinafch hast Du und suchst:

Code: Alles auswählen

test=*# select * from monate ;
 id |  monat
----+---------
  1 | januar
  2 | februar
  3 | märz
  4 | april
  3 | märz
  5 | mai
  5 | mai
  6 | juni
(8 rows)

Time: 0,123 ms
test=*# select string_agg(monat,', ' order by id) from (select distinct id, monat from monate) foo ;
               string_agg
-----------------------------------------
 januar, februar, märz, april, mai, juni
(1 row)

Antworten