Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Daten abfragen und ändern » Abfrageergebnisse zusammenfassen, gruppieren und sortieren » Abfrageergebnisse mit Aggregatfunktionen zusammenfassen

 

Wo Sie Aggregatfunktionen verwenden können

Aggregatfunktionen können in einer Auswahlliste wie in den vorhergehenden Beispielen oder in der HAVING-Klausel einer Select-Anweisung verwendet werden, die eine GROUP BY-Klausel enthält. Weitere Hinweise finden Sie unter HAVING-Klausel: Datengruppen auswählen.

Sie können Aggregatfunktionen nicht in einer WHERE-Klausel oder in einer JOIN-Bedingung verwenden. Allerdings schließt eine SELECT-Anweisung mit Aggregatfunktionen in ihrer Auswahlliste oft eine WHERE-Klausel ein, mit der die Zeilen beschränkt werden, auf die die Aggregatfunktion angewendet wird.

Wenn eine SELECT-Anweisung eine WHERE-Klausel, nicht aber eine GROUP BY-Klausel enthält, produziert eine Aggregatfunktion einen einzelnen Wert für die Teilmenge der Zeilen, die die WHERE-Klausel festlegt.

Wenn eine Aggregatfunktion in einer SELECT-Anweisung verwendet wird, die keine GROUP BY-Klausel enthält, wird ein einzelner Wert produziert. Dies gilt unabhängig davon, ob sie auf alle Zeilen in einer Tabelle wirkt oder auf eine Teilmenge der Zeilen, die durch eine WHERE-Klausel definiert werden.

Sie können mehr als eine Aggregatfunktion in derselben Auswahlliste verwenden und mehr als ein Skalaraggregat in einer einzelnen SELECT-Anweisung produzieren.

Aggregatfunktionen und äußere Referenzen

SQL Anywhere befolgt die Standards von SQL/2003, um die Verwendung von Aggregatfunktionen zu regeln, wenn sie in einer Unterabfrage vorkommen. Diese Änderungen betreffen das Verhalten von Anweisungen, die für frühere Versionen der Software geschrieben wurden: Abfragen, die bisher richtig programmiert waren, können jetzt Fehlermeldungen erzeugen, und es kann sein, dass sich Ergebnismengen ändern.

Wenn eine Aggregatfunktion in einer Unterabfrage erscheint und die Spalte, die von der Aggregatfunktion referenziert wird, eine äußere Referenz darstellt, wird die gesamte Aggregatfunktion jetzt als äußere Referenz behandelt. Das bedeutet, dass die Aggregatfunktion jetzt im äußeren Block ausgewertet wird und nicht in der Unterabfrage. Daher wird sie zu einer Konstanten der Unterabfrage.

Die folgenden Einschränkungen gelten für die Verwendung von Aggregatfunktionen mit äußerer Referenz in Unterabfragen:

  • Die Aggregatfunktion mit äußerer Referenz kann nur in Unterabfragen erscheinen, die sich in der SELECT-Liste oder der HAVING-Klausel befinden, und diese Klauseln müssen immer im unmittelbar anschließenden äußeren Block enthalten sein.

  • Aggregatfunktionen mit äußerer Referenz können nur eine äußere Spaltenreferenz enthalten.

  • Lokale Spaltenreferenzen und äußere Spaltenreferenzen können in derselben Aggregatfunktion nicht gemischt verwendet werden.

Einige Probleme, die in Verbindung mit diesen neuen Standard auftauchen, können vermieden werden , indem Sie die Aggregatfunktion neu formulieren und darin nur lokale Referenzen verwenden. Die Unterabfrage (SELECT MAX(S.y + R.y) FROM S) beispielsweise enthält sowohl eine lokale (S.y) als auch eine äußere (R.y) Spaltenreferenz, was nun nicht mehr zulässig ist. Sie kann als (SELECT MAX(S.y) + R.y FROM S) umgeschrieben werden. In der Neuprogrammierung hat die Aggregatfunktion nur eine lokale Spaltenreferenz. Die gleiche Art der Neuprogrammierung kann angewendet werden, wenn eine Aggregatfunktion mit äußerer Referenz nicht in einer SELECT- oder einer HAVING-Klausel auftritt.

Beispiel

Die folgende Abfrage ergab in Adaptive Server Anywhere Version 7 das nachstehende Ergebnis.

SELECT Name, 
      ( SELECT SUM( p.Quantity )
           FROM SalesOrderItems )
   FROM Products p;
Name SUM(p.Quantity)
Tee shirt 30,716
Tee shirt 59,238

In späteren Versionen bewirkt dieselbe Abfrage die Fehlermeldung SQL Anywhere Fehler -149: Funktion oder Spaltenreferenz auf 'name' muss auch in einer GROUP BY-Klausel erscheinen. Der Grund, warum die Anweisung nicht mehr gültig ist, liegt darin, dass die Aggregatfunktion mit der äußeren Referenz sum(p.Quantity) jetzt im äußeren Block ausgewertet wird. In späteren Versionen ist die Abfrage semantisch gleichwertig der nachfolgend dargestellten Anweisung (mit Ausnahme der Tatsache, dass Z nicht als Teil der Ergebnismenge erscheint):

SELECT Name,
       SUM( p.Quantity ) AS Z,
       ( SELECT Z 
            FROM SalesOrderItems )
   FROM Products p;

Da der äußere Block jetzt eine Aggregatfunktion berechnet, wird er als gruppierte Abfrage behandelt, und der Spaltename muss in einer GROUP BY-Klausel erscheinen, um in die SELECT-Liste aufgenommen zu werden.