SELECT 文内またはプロシージャ内に特定の値のセットを格納すると便利な場合があります。たとえば、ある会社で販売担当者の成績を分析する際の単位として、四半期ではなく、1 年を 3 期に分けた期間を採用しているとします。四半期という日付の単位は組み込まれていますが、1 年を 3 期に分けた日付の単位はないため、プロシージャ内で日付を格納する必要があります。
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; |
この方法は、値を定期的に保守する必要があるため、注意して使用する必要があります。たとえば、前述の文は、他の年に対して使用する場合は修正する必要があります。
この方法をプロシージャ内で適用することもできます。次の例は、対象の年を引数として受け取るプロシージャを宣言しています。
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; |
次の文を実行すると、前述のプロシージャが呼び出されます。
CALL sales_by_third (2000); |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |