SQL Intersection mit nachfolgender Gruppierung

Hallo zusammen,

ich bin gerade dabei, einen SQL-Request in pgAdminIII zu basteln, der mir aus zwei Geometrietabellen passende Zeilen aussucht, dann Tabellen miteinander verschneidet und anschließend das Ergebnis nach einem bestimmten Kriterien gruppiert. Ich bin erfolgreich bis zur Verschneidung durchgekommen, kann allerdings keine Gruppierung durchführen.

Könnt ihr mir vielleicht einen Tipp geben, woran es scheitert und wie man den Fehler umgehen kann?

SQL-Request:

Select b.distr, Area (ST_Intersection (a.the_geom, b.the_geom) AS  intersection_geom FROM tabelle1 as a, tabelle2 as b WHERE ISEmpty  (ST_Intersection (a.the_geom, b.the_geom)) = FALSE AND b.name <>  'Helgoland' AND a.poskey = 'Watt' GROUP BY b.distr;

Die Fehlermeldung lautet: Spalte “a.the_geom” muss in der GROUP-BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden.

Danke im Voraus.

Die Fehlermeldung ist doch eigentlich klar, oder? Du wirst a.the_geom sicherlich nicht aggregieren wollen (also davon max() oder so bilden), dann entweder diese Spalte auch noch in das GROUP BY aufnehmen, oder, was dasselbe ist, GROUP BY ganz weglassen.


Andreas

Ja, die Fehlermeldung ist klar :slight_smile: Die Frage ist, wie kann ich sie vermeiden. Die Idee ist folgende:

  • aus zwei Tabellen passende Daten filtern,
  • diese Daten aus zwei Tabellen miteinander überschneiden (bis zu dieser Stelle komme ich - das Ergebnis ist eine Tabelle mit zwei Spalten, “distr” und “intersection_geom”)
  • nun möchte ich diese Tabelle so umformen, dass sie nur noch aus zwei Zeilen besteht - das sind nämlich zwei unterschiedliche “distr”, sagen wir mal distr_A und distr_B. Ich brauche Summen von Flächen für jedes “distr”, so ungefähr:
    distr | intersection_geom
    distr_A 123456
    distr_B 789012

Oder verstehe ich die Funktion GROUP BY falsch? Wie kann ich dann nach dem Attribut “distr” dazugehörige Flächen zusammenaddieren?

Ok, ich hab’s hingekriegt! Bei mir fehlte die SUM-Operation für die Flächen.

So funktioniert es genau, wie ich es brauche:

Select b.distr, SUM (Area (ST_Intersection (a.the_geom, b.the_geom)))
AS intersection_geom FROM tabelle1 as a, tabelle2 as b
WHERE ISEmpty (ST_Intersection (a.the_geom, b.the_geom)) = FALSE
AND b.name <> ‘XXX’ AND a.poskey = ‘YYY’
GROUP BY b.distr;