Hallo,
ich versuche seit ein paar Tagen eine Aggregatfunktion, die für eine zukünftige Arbeitroutine dienen soll, zu erstellen. Nachdem ich eine zweite Tabelle als Datenquelle hinzunehmen musste stimme die Ergebniswerte nicht mehr. Ursache ist der gebildete CROSS JOIN da eine der beiden Tabellen länger ist als die andere. So werden in Tabelle 1 (die kürzere) einige Werte vielfach gezählt. Allein der Wert für ide installierbare Modulfläche, welcher aus Tabelle 2 aggregiert wird stimmt in folgendem Beispiel:
SELECT
sum(s.bedarf2050_kwh_a) AS bedarf_kWh_a,
sum(s.bedarf2050_kwh_a)*0.2 AS netzverlust,
sum(s.bedarf2050_kwh_a) + sum(s.bedarf2050_kwh_a)*0.2 AS gesamtbedarf,
sum(pv.modulflaeche_qm) AS instbar_modulflaeche_qm
FROM
siedlungsareale_wbm s, pv_st_potenziale_gis pv
WHERE
s.vg_solar LIKE '%NWS 2%'
AND
ST_Covers(s.geom, pv.geom);
Anschließend habe ich verschiedene Varianten ausprobiert. Auch das Weglassen der ST_Covers (PostGIS-Funktion) und das Versehen der relevanten Einträge in Tabelle 2 mit dem gleichen Kennstring “NWS 2” brachte hier keine Abhilfe.
Was teilweise richtige Werte liefert, aber als schmutzige Lösung ausfällt ist ein DISTINCT-Eintrag in die Summenformeln:
SELECT
SUM(DISTINCT s.bedarf2050_kwh_a) AS bedarf_kWh_a,
SUM(DISTINCT s.bedarf2050_kwh_a)*0.2 AS netzverlust,
SUM(DISTINCT s.bedarf2050_kwh_a) + SUM(DISTINCT s.bedarf2050_kwh_a)*0.2 AS gesamtbedarf,
SUM(pv.modulflaeche_qm) AS instbar_modulflaeche_qm,
(SUM(DISTINCT s.bedarf2050_kwh_a) + SUM(DISTINCT s.bedarf2050_kwh_a)*0.2)*0.01499 AS startwert_speichergroesse
FROM
siedlungsareale_wbm s, pv_st_potenziale_gis pv
WHERE
pv.vg_solar LIKE '%NWS 2%'
AND
ST_Covers(s.geom, pv.geom);
Hier erhalte ich für alle Werte aus Tabelle 1 richtige Ergebnisse, für die Modulflächen allerdings nicht. Das liegt daran, dass Einzelwerte der Modulflächen zum Teil mehrmals vorkommen. Der DISTINCT Eintrag wirft diese aus der Berechnung heraus. Das darf natürlich nicht sein, da die Query als Routine dienen soll und später unmöglich geprüft werden kann ob in jedem Einzelfall alle Werte nur einmal vorkommen.
Daher muss eine andere Lösung her. Leider stehe ich mit meinen nicht sehr umfassenden SQL-Kenntnissen etwas auf dem Schlauch. Möglich wäre eine andere Variante des JOIN, jedoch blieben alle eigenen Versuche erfolglos. Auch die Verwendung von DISTINCT für die jeweiligen Tabellen, der sich jedoch auf andere als die zu berechnenden Spalten beziehen müsste. Z.B. auf die jeweilige ID-Spalte.
Im IRC erhielt ich letze Woche einen Tipp dieser Art der Einbindung, brachte jedoch nichts:
FROM siedlungsareale_wbm s
WHERE pv.vg_solar LIKE '%NWS 2%' AND EXISTS (SELECT TRUE FROM pv_st_potenziale_gis pv WHERE ST_Covers(s.geom, pv.geom));
Evtl. wäre jedoch auch eine Subquery ein sinnvoller Lösungsansatz. Für Ratschläge und Hinweise wäre ich sehr dankbar. Wie kann ich sicherstellen, dass für die Berechnungen der Formeln wirklich nur die vorhandenen Einträge der jeweiligen Tabellen herangezogen werden und keine seltsamen JOIN-Effekte zum Tragen kommen?