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

SQL Anywhere 12.0.0 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Daten abfragen und ändern » Allgemeine Tabellenausdrücke » Typische Anwendungen von allgemeinen Tabellenausdrücken

 

Ansichten, die Variablen referenzieren

Manchmal kann es nützlich sein, eine Ansicht zu erstellen, die eine Referenz zu einer Programmvariablen enthält. Sie können zum Beispiel eine Variable innerhalb einer Prozedur definieren, die einen bestimmten Kunden kennzeichnet. Sie möchten das Kaufverhalten des Kunden abfragen, und da Sie auf ähnliche Daten mehrfach zugreifen, oder möglicherweise mehrere Aggregatfunktionen verwenden werden, empfiehlt es sich, eine Ansicht zu erstellen, die die Daten über den angegebenen Kunden enthält.

Sie können keine Ansicht erstellen, die eine Programmvariable referenziert, weil es keine Möglichkeit gibt, den Bereich einer Ansicht auf den Ihrer Prozedur zu beschränken. Sobald sie erstellt ist, kann eine Ansicht in anderen Kontexten verwendet werden. Sie können allerdings einen allgemeinen Tabellenausdruck innerhalb der Abfragen in Ihrer Prozedur verwenden. Da der Bereich eines allgemeinen Tabellenausdrucks auf die Anweisung beschränkt ist, erzeugt die Variablenreferenz keine Zweideutigkeit und ist zulässig.

Die folgende Anweisung wählt die Bruttoverkaufszahlen verschiedener Handelsvertreter in der SQL Anywhere-Beispieldatenbank aus:

SELECT GivenName || ' ' || Surname AS sales_rep_name,
       SalesRepresentative AS sales_rep_id,
       SUM( p.UnitPrice * i.Quantity ) AS total_sales
FROM Employees LEFT OUTER JOIN SalesOrders AS o
              INNER JOIN SalesOrderItems AS I
              INNER JOIN Products AS p
WHERE OrderDate BETWEEN '2000-01-01' AND '2001-12-31'
GROUP BY SalesRepresentative, GivenName, Surname;

Die oben stehende Abfrage ist die Basis des allgemeinen Tabellenausdrucks, der in der folgenden Prozedur erscheint: Die ID-Nummer eines Handelsvertreters und das in Frage kommende Jahr sind hereinkommende Parameter. Wie die folgende Prozedur zeigt, können Prozedurparameter und etwaige deklarierte lokale Variable innerhalb der WITH-Klausel referenziert werden.



CREATE PROCEDURE sales_rep_total (
  IN rep  INTEGER,
  IN yyyy INTEGER )
BEGIN
  DECLARE StartDate DATE;
  DECLARE EndDate   DATE;
  SET StartDate = YMD( yyyy,  1,  1 );
  SET EndDate = YMD( yyyy, 12, 31 );
  WITH total_sales_by_rep ( sales_rep_name,
                            sales_rep_id,
                            month,
                            order_year,
                            total_sales ) AS
  ( SELECT GivenName || ' ' || Surname AS sales_rep_name,
           SalesRepresentative AS sales_rep_id, 
           month( OrderDate),
           year( OrderDate ),
           SUM( p.UnitPrice * i.Quantity ) AS total_sales
    FROM Employees LEFT OUTER JOIN SalesOrders o
                       INNER JOIN SalesOrderItems I
                       INNER JOIN Products p
    WHERE OrderDate BETWEEN StartDate AND EndDate
           AND SalesRepresentative = rep
    GROUP BY year( OrderDate ), month( OrderDate ),
             GivenName, Surname, SalesRepresentative )
  SELECT sales_rep_name,
         monthname( YMD(yyyy, month, 1) ) AS month_name,
         order_year,
         total_sales
  FROM total_sales_by_rep
  WHERE total_sales =
    ( SELECT MAX( total_sales) FROM total_sales_by_rep )
  ORDER BY order_year ASC, month ASC;
END;

Die folgende Anweisung ruft die obige Prozedur auf.

CALL sales_rep_total( 129, 2000 );