Login    Register

XLeratorDB/statistics Documentation

FORECAST


FORECAST

Updated: 15 January 2011

Use the aggregate FORECAST to calculate a future value by using existing values. The predicted value is a y-value for a given x-value. The known values are existing x-values and y-values, and the new value is predicted using linear regression.

FORECAST function for SQL Server

Syntax
SELECT [wctStatistics].[wct].[FORECAST] (
<@fmtFORECAST, nvarchar(4000),>)
 
The syntax has changed as of release 1.07 and the function has changed from a scalar to an aggregate. Please make the appropriate changes when you upgrade to 1.07.
Arguments
 
@fmtFORECAST
An nvarchar string formatted by the fmtFORECAST function containing the known-y and known-x and new-x values to be used by the FORECAST calculation.
Return Types
float
Remarks
·         FORECAST is an AGGREGATE function and follows the same conventions as all other AGGREGATE functions in SQL Server.
·         FORECAST is a one-pass solution. For a two-pass solution, use the FORECAST_q function.
Examples
In this example, we calculate the trend for a single set of x- and y-values with a single new x value
SELECT wct.FORECAST(wct.fmtFORECAST(12.5, y, x)) as FORECAST
FROM (
      SELECT 0.75, 1 UNION ALL
      SELECT 2.5, 2 UNION ALL
      SELECT 6.75, 3 UNION ALL
      SELECT 10, 4
      ) n(x,y)
 
This produces the following result
              FORECAST
----------------------
      4.79116945107399
 
(1 row(s) affected)
In this example, we will populate some temporary table with some historical financial information and then calculate a forecast. First, create the table and put some data in it:
CREATE TABLE #c(
      SYM         NVARCHAR(5),
      YE          BIGINT,
      REV         FLOAT,
      GPROF       FLOAT,
      OPINC       FLOAT,
      NETINC      FLOAT
      )
     
INSERT INTO #c VALUES('YHOO',2009,6460.32,3588.57,386.69,597.99)
INSERT INTO #c VALUES('YHOO',2008,72.5,4185.14,12.96,418.92)
INSERT INTO #c VALUES('YHOO',2007,6969.27,4130.52,695.41,639.16)
INSERT INTO #c VALUES('YHOO',2006,6425.68,3749.96,940.97,751.39)
INSERT INTO #c VALUES('YHOO',2005,5257.67,3161.47,1107.73,1896.23)
INSERT INTO #c VALUES('GOOG',2009,23650.56,14806.45,8312.19,6520.45)
INSERT INTO #c VALUES('GOOG',2008,21795.55,13174.04,5537.21,4226.86)
INSERT INTO #c VALUES('GOOG',2007,16593.99,9944.9,54.44,4203.72)
INSERT INTO #c VALUES('GOOG',2006,10604.92,6379.89,3550,3077.45)
INSERT INTO #c VALUES('GOOG',2005,6138.56,3561.47,2017.28,1465.4)
INSERT INTO #c VALUES('MSFT',2009,62484,509,24167,18760)
INSERT INTO #c VALUES('MSFT',2008,58437,46282,21225,14569)
INSERT INTO #c VALUES('MSFT',2007,60420,48822,22271,17681)
INSERT INTO #c VALUES('MSFT',2006,51122,40429,18438,14065)
INSERT INTO #c VALUES('MSFT',2005,44282,36632,16064,12599)
INSERT INTO #c VALUES('ORCL',2009,26820,21056,9062,6135)
INSERT INTO #c VALUES('ORCL',2008,23252,18458,8321,5593)
INSERT INTO #c VALUES('ORCL',2007,22430,17449,7844,5521)
INSERT INTO #c VALUES('ORCL',2006,17996,13805,5974,4274)
INSERT INTO #c VALUES('ORCL',2005,14380,11145,4736,3381)
INSERT INTO #c VALUES('SAP',2009,10672,6980,2588,1748)
INSERT INTO #c VALUES('SAP',2008,11575,7370,2701,1847)
INSERT INTO #c VALUES('SAP',2007,10256,6631,2698,1906)
INSERT INTO #c VALUES('SAP',2006,9393,6064,2578,1871)
INSERT INTO #c VALUES('SAP',2005,8509,5460,2337,1496)
In this example, we will forecast the revenue (REV) against the year (YE)
SELECT SYM
,ROUND(wct.FORECAST(wct.fmtFORECAST(2010,REV,YE)), 0) as [2010 Revenue]
,ROUND(wct.FORECAST(wct.fmtFORECAST(2011,REV,YE)), 0) as [2011 Revenue]
,ROUND(wct.FORECAST(wct.fmtFORECAST(2012,REV,YE)), 0) as [2012 Revenue]
FROM #c
GROUP BY SYM
 
This produces the following result.
SYM             2010 Revenue           2011 Revenue           2012 Revenue
----- ---------------------- ---------------------- ----------------------
GOOG                   29621                  34243                  38864
MSFT                   64093                  68465                  72837
ORCL                   27003                  30016                  33030
SAP                    12033                  12684                  13335
YHOO                    3853                   3458                   3063
 
(5 row(s) affected)
To calculate the net income using the revenue projections from the above query, we could enter the following statement.
SELECT #c.SYM
,ROUND(wct.FORECAST(wct.fmtFORECAST([2010 Revenue],NETINC, REV)), 0) as [2010 Net Income]
,ROUND(wct.FORECAST(wct.fmtFORECAST([2011 Revenue],NETINC, REV)), 0) as [2011 Net Income]
,ROUND(wct.FORECAST(wct.fmtFORECAST([2012 Revenue],NETINC, REV)), 0) as [2012 Net Income]
FROM (
      SELECT SYM
      ,ROUND(wct.FORECAST(wct.fmtFORECAST(2010,REV,YE)), 0) as [2010 Revenue]
      ,ROUND(wct.FORECAST(wct.fmtFORECAST(2011,REV,YE)), 0) as [2011 Revenue]
      ,ROUND(wct.FORECAST(wct.fmtFORECAST(2012,REV,YE)), 0) as [2012 Revenue]
      FROM #c
      GROUP BY SYM) n, #c
WHERE n.sym = #c.sym
GROUP BY #c.SYM
This returns the following results.
SYM          2010 Net Income        2011 Net Income        2012 Net Income
----- ---------------------- ---------------------- ----------------------
GOOG                    7107                   8176                   9246
MSFT                   18222                  19566                  20910
ORCL                    6367                   7060                   7753
SAP                     1945                   2002                   2059
YHOO                     807                    789                    771
 
(5 row(s) affected)
As the following query demonstrates, this returns a different result than if we had just looked at the net income over time.
SELECT SYM
,ROUND(wct.FORECAST(wct.fmtFORECAST(2010,NETINC, YE)), 0) as [2010 Net Income]     
,ROUND(wct.FORECAST(wct.fmtFORECAST(2011,NETINC, YE)), 0) as [2011 Net Income]     
,ROUND(wct.FORECAST(wct.fmtFORECAST(2012,NETINC, YE)), 0) as [2012 Net Income]     
FROM #c
GROUP BY SYM
 
This produces the following result.
SYM          2010 Net Income        2011 Net Income        2012 Net Income
----- ---------------------- ---------------------- ----------------------
GOOG                    7277                   8403                   9529
MSFT                   18100                  19383                  20665
ORCL                    6346                   7029                   7712
SAP                     1918                   1966                   2014
YHOO                     -18                   -311                   -604
 

(5 row(s) affected)



  Comments
Add Comment
No Comments Yet


 |  View Topic History  |
Copyright 2010 WestClinTech LLC         Privacy Policy        Terms of Service