Sometimes, it can be convenient to create a view that contains a reference to a program variable. For example, you may define a variable within a procedure that identifies a particular customer. You want to query the customer's purchase history, and as you will be accessing similar information multiple times or perhaps using multiple aggregate functions, you want to create a view that contains information about that specific customer.
You cannot create a view that references a program variable because there is no way to limit the scope of a view to that of your procedure. Once created, a view can be used in other contexts. You can, however, use a common table expressions within the queries in your procedure. As the scope of a common table expression is limited to the statement, the variable reference creates no ambiguity and is permitted.
The following statement selects the gross sales of the various sales representatives in the SQL Anywhere sample database.
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; |
The above query is the basis of the common table expression that appears in the following procedure. The ID number of the sales representative and the year in question are incoming parameters. As the following procedure demonstrates, the procedure parameters and any declared local variables can be referenced within the WITH clause.
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; |
The following statement calls the previous procedure.
CALL sales_rep_total( 129, 2000 ); |
Discuss this page in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |