---- Create a test table and insert some data
IF OBJECT_ID('ProductionHistory')>0
DROP TABLE ProductionHistory;
CREATE TABLE [dbo].[ProductionHistory]
(
[WellID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[WellName] [varchar](50) NULL,
[Date] datetime NULL,
[Oil] decimal(18,6) NULL,
[Gas] decimal(18,6) NULL,
[Water] decimal(18,6) NULL
)
DECLARE @counter int
SET @counter = 1
WHILE (@counter <=1000)
BEGIN
INSERT INTO [ProductionHistory](Wellname, [date], [oil], [gas], [water])
VALUES ('Mustang Ranch #1', DATEADD(day, @counter, '2009-01-01'), 50 + (80-50)*RAND(), 10 + (30-10)*RAND(), 1 + (10-1)*RAND())
INSERT INTO [ProductionHistory](Wellname, [date], [oil], [gas], [water])
VALUES ('Mary May #1', DATEADD(day, @counter, '2009-01-01'), 80 + (120-80)*RAND(), 1 + (10-1)*RAND(), 20 + (30-20)*RAND())
SET @counter = @counter + 1
END
GO
---- Create a table valued function to sum values to date
Create FUNCTION dbo.udf_GetCumulativeProduction
(
@WellName varchar(50),
@Date datetime
)
RETURNS @CumulativeProductionTable TABLE
(
CumulativeOil Decimal(18,6),
CumulativeGas Decimal(18,6),
CumulativeWater Decimal(18,6)
)
BEGIN
INSERT INTO @CumulativeProductionTable(CumulativeOil, CumulativeGas, CumulativeWater)
SELECT
SUM(Oil), SUM(Gas), Sum(Water)
FROM
ProductionHistory
WHERE WellName = @WellName
AND Date <= @Date
RETURN
END
GO
---- Call the function for each row
SELECT *
FROM ProductionHistory ph
CROSS APPLY dbo.udf_GetCumulativeProduction(ph.wellName, ph.date)
Wanted to have a simple example of a table-valued function. For this example I created some daily production data for a couple of wells. I use the table valued function to calculate the cumulative production to date for each well.
No comments:
Post a Comment