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

SQL Anywhere 12.0.1 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Abfrage und Änderung von Daten » Allgemeine Tabellenausdrücke » Typische Anwendungen von allgemeinen Tabellenausdrücken

 

Ansichten, die Werte speichern

Es kann nützlich sein, eine bestimmte Menge von Werten innerhalb einer SELECT-Anweisung oder einer Prozedur zu speichern. Nehmen wir zum Beispiel an, dass eine Firma es vorzieht, die Ergebnisse ihrer Handelsvertreter anstatt quartalsweise pro Jahresdrittel zu analysieren. Da es im Gegensatz zu den Quartalen keine integrierten Datumsteile für Jahresdrittel gibt, ist es notwendig, die Datumsangaben innerhalb der Prozedur zu speichern.



WITH thirds ( q_name, q_start, q_end ) AS
( SELECT 'T1', '2000-01-01', '2000-04-30' UNION
  SELECT 'T2', '2000-05-01', '2000-08-31' UNION
  SELECT 'T3', '2000-09-01', '2000-12-31' )
SELECT q_name,
       SalesRepresentative,
       count(*) AS num_orders,
       SUM( p.UnitPrice * i.Quantity ) AS total_sales
FROM thirds LEFT OUTER JOIN SalesOrders AS o
    ON OrderDate BETWEEN q_start and q_end
                   KEY JOIN SalesOrderItems AS I
                   KEY JOIN Products AS p
 GROUP BY q_name, SalesRepresentative
 ORDER BY q_name, SalesRepresentative;

Diese Methode sollte mit Umsicht verwendet werden, da die Werte möglicherweise periodische Aktualisierungen erfordern. So muss zum Beispiel die oben stehende Anweisung modifiziert werden, um für ein anderes Jahr zu gelten.

Sie können diese Methode auch innerhalb von Prozeduren verwenden. Das folgende Beispiel deklariert eine Prozedur, die das betreffende Jahr als Argument nimmt.



CREATE PROCEDURE sales_by_third ( IN y INTEGER )
BEGIN
  WITH thirds ( q_name, q_start, q_end ) AS
  ( SELECT 'T1', YMD( y, 01, 01), YMD( y, 04, 30 ) UNION
    SELECT 'T2', YMD( y, 05, 01), YMD( y, 08, 31 ) UNION
    SELECT 'T3', YMD( y, 09, 01), YMD( y, 12, 31 ) )
  SELECT q_name,
         SalesRepresentative,
         count(*) AS num_orders,
         SUM( p.UnitPrice * i.Quantity ) AS total_sales
  FROM thirds LEFT OUTER JOIN SalesOrders AS o
    ON OrderDate BETWEEN q_start and q_end
            KEY JOIN SalesOrderItems AS I
            KEY JOIN Products AS p
  GROUP BY q_name, SalesRepresentative
  ORDER BY q_name, SalesRepresentative;
END;

Die folgende Anweisung ruft die obige Prozedur auf.

CALL sales_by_third (2000);