Here's what it looks like:CREATE TABLE [dbo].[tbl875Fixed]( [Event Date] [datetime] NOT NULL, [AD_ID] [float] NOT NULL, [Advertiser] [nvarchar](100) NULL, [Description] [nvarchar](100) NULL, [Start Date] [datetime] NULL, [End Date] [datetime] NULL, [Ad Size] [nvarchar](10) NULL, [Rate] [money] NULL, [Booked] [float] NULL, [Total Daily Delivered] [float] NULL, [Total Campaign Delivered] [float] NULL, [Total Daily Clicks Delivered] [float] NULL, [Total Campaign Clicks Delivered] [float] NULL, [Content Category] [nvarchar](100) NULL, [PO Num] [nvarchar](25) NULL, [SalesPerson] [nvarchar](40) NULL, CONSTRAINT [aaaaatbl875Fixed_PK] PRIMARY KEY NONCLUSTERED ( [Event Date] ASC, [AD_ID] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]ALTER TABLE [dbo].[tbl875Fixed] WITH CHECK ADD CONSTRAINT [FK_tbl875Fixed_tblAdvertisers] FOREIGN KEY([Advertiser])REFERENCES [dbo].[tblAdvertisers] ([Advertiser])GOALTER TABLE [dbo].[tbl875Fixed] CHECK CONSTRAINT [FK_tbl875Fixed_tblAdvertisers]GOALTER TABLE [dbo].[tbl875Fixed] WITH CHECK ADD CONSTRAINT [FK_tbl875Fixed_tblSalespeople] FOREIGN KEY([SalesPerson])REFERENCES [dbo].[tblSalespeople] ([Sales Person])GOALTER TABLE [dbo].[tbl875Fixed] CHECK CONSTRAINT [FK_tbl875Fixed_tblSalespeople]CREATE TABLE [dbo].[tblImpsLandedByCC]( [Event Date] [datetime] NOT NULL, [AD_ID] [float] NOT NULL, [Content Category] [nvarchar](255) NOT NULL, [SumOfImpressions Delivered] [float] NULL, [SumOfClicks Delivered] [float] NULL, CONSTRAINT [aaaaatblImpsLandedByCC_PK] PRIMARY KEY NONCLUSTERED ( [Event Date] ASC, [AD_ID] ASC, [Content Category] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]ALTER TABLE [dbo].[tblImpsLandedByCC] WITH CHECK ADD CONSTRAINT [tblImpsLandedByCC_FK00] FOREIGN KEY([Content Category])REFERENCES [dbo].[tblContentCategories] ([Content Category])ON UPDATE CASCADEGOALTER TABLE [dbo].[tblImpsLandedByCC] CHECK CONSTRAINT [tblImpsLandedByCC_FK00]GOALTER TABLE [dbo].[tblImpsLandedByCC] WITH CHECK ADD CONSTRAINT [tblImpsLandedByCC_FK01] FOREIGN KEY([Event Date], [AD_ID])REFERENCES [dbo].[tbl875Fixed] ([Event Date], [AD_ID])ON UPDATE CASCADEGOALTER TABLE [dbo].[tblImpsLandedByCC] CHECK CONSTRAINT [tblImpsLandedByCC_FK01]GOALTER FUNCTION dbo.PacingMinimized(@EndDate varchar(10))RETURNS @output TABLE([Advertiser Name] varchar(100),[Content Category] varchar(50), [Targeted Category] varchar(100), [Start Date] datetime, [Ad End Date] datetime, [Ad Rate] money, [Creative Size] varchar(7), [Booked Total] bigint, [Daily Dlvry] bigint, [Imps Dlvrd MTD] bigint, [Imps Dlvrd Total] bigint, [Mnth Forecast] bigint, [Ideal Mnthly Imps] bigint, [Booked Imps] bigint, [Rev MTD] money, [Rev Forecast] money, [Ideal Mnthly Rev] money, [Booked Rev] money, [Revenue Delta] money, SalesPerson varchar(60), [Ad ID] bigint )BEGINDeclare @BegMonth datetimeDeclare @EndMonth datetimeSet @BegMonth = dbo.BegMonth(@EndDate)Set @EndMonth = dbo.EndMonth(@EndDate)Insert @Output SELECT tbl875Fixed.Advertiser, tblImpsLandedByCC.[Content Category], tbl875Fixed.[Content Category] AS [Targeted Category], tbl875Fixed.[Start Date], tbl875Fixed.[End Date], tbl875Fixed.Rate, tbl875Fixed.[Ad Size], SUM(tbl875Fixed.Booked) * dbo.PercentOfTotal(SUM(tblImpsLandedByCC.[SumOfImpressions Delivered]), SUM([Imps Targeted].[Targeted Imps])) AS [Booked Total], CASE WHEN dbo.LiveDaysMTD([Start Date], [End Date], @EndDate) = 0 THEN 0 ELSE SUM([SumOfImpressions Delivered]) / dbo.LiveDaysMTD([Start Date], [End Date], @EndDate) END AS [Daily Dlvry], SUM(tblImpsLandedByCC.[SumOfImpressions Delivered]) AS [Imps Dlvrd MTD], SUM(tbl875Fixed.[Total Campaign Delivered]) * dbo.PercentOfTotal(SUM(tblImpsLandedByCC.[SumOfImpressions Delivered]), SUM([Imps Targeted].[Targeted Imps])) AS [Imps Dlvrd Total], 50000 AS [Mnth Forecast], 50000 AS [Ideal Mnthly Imps], 50000 AS [Booked Imps], 1000 AS [Rev MTD], 2000 AS [Rev Forecast], 2500 AS [Ideal Mnthly Rev], 2500 AS [Booked Rev], - 150 AS [Revenue Delta], tbl875Fixed.SalesPerson, tbl875Fixed.AD_ID AS [Ad ID] FROM tbl875Fixed Inner Join tblContentCategories ON tbl875Fixed.[Content Category] = tblContentCategories.[Content Category] INNER JOIN (SELECT AD_ID, MAX([Event Date]) AS MAX_Date FROM tbl875Fixed AS tbl875Fixed_1 GROUP BY AD_ID) AS Latest ON Latest.AD_ID = tbl875Fixed.AD_ID AND Latest.MAX_Date = tbl875Fixed.[Event Date] INNER JOIN tblImpsLandedByCC ON tbl875Fixed.AD_ID = tblImpsLandedByCC.AD_ID INNER JOIN (SELECT AD_ID, SUM([Total Daily Delivered]) AS [Targeted Imps] FROM tbl875Fixed AS tbl875Fixed_2 WHERE ([Event Date] <= CONVERT(datetime, @EndDate)) AND ([Event Date] >= dbo.BegMonth(@EndDate)) GROUP BY AD_ID) AS [Imps Targeted] ON tbl875Fixed.AD_ID = [Imps Targeted].AD_ID INNER JOIN (SELECT tbl875Fixed_3.AD_ID, tblImpsLandedByCC_1.[Content Category], SUM(tblImpsLandedByCC_1.[SumOfImpressions Delivered] / 1000 * tbl875Fixed_3.Rate) AS [Revenue MTD] FROM tbl875Fixed AS tbl875Fixed_3 INNER JOIN tblImpsLandedByCC AS tblImpsLandedByCC_1 ON tbl875Fixed_3.[Event Date] = tblImpsLandedByCC_1.[Event Date] AND tbl875Fixed_3.AD_ID = tblImpsLandedByCC_1.AD_ID WHERE (tblImpsLandedByCC_1.[Event Date] <= CONVERT(datetime, @EndDate)) AND (tblImpsLandedByCC_1.[Event Date] >= dbo.BegMonth(@EndDate)) GROUP BY tbl875Fixed_3.AD_ID, tblImpsLandedByCC_1.[Content Category]) AS Rev_MTD ON tbl875Fixed.AD_ID = Rev_MTD.AD_ID AND tblContentCategories.[Content Category] = Rev_MTD.[Content Category]WHERE (tblImpsLandedByCC.[Event Date] <= CONVERT(datetime, @EndDate)) AND (tblImpsLandedByCC.[Event Date] >= dbo.BegMonth(@EndDate))GROUP BY tbl875Fixed.Advertiser, tblImpsLandedByCC.[Content Category], tbl875Fixed.[Content Category], tbl875Fixed.[Ad Size], tbl875Fixed.AD_ID, tbl875Fixed.[Start Date], tbl875Fixed.[End Date], tbl875Fixed.Rate, tbl875Fixed.SalesPerson RETURNENDALTER FUNCTION [dbo].[BegMonth] ( @Date datetime)RETURNS datetimeASBEGIN DECLARE @Result datetime -- Add the T-SQL statements to compute the return value here SELECT @Result = Convert(datetime, cast(datepart(month,@Date)as varchar) + '/' + cast('1' as varchar) + '/' + cast(datepart(year,@Date)as varchar) ) -- Return the result of the function RETURN @ResultENDALTER FUNCTION [dbo].[EndMonth] ( @Date datetime)RETURNS datetimeASBEGIN DECLARE @Result datetime SELECT @Result = Convert(datetime, convert(varchar,datepart(mm,@Date)+1) + '/' + convert(varchar,'1') + '/' + convert(varchar,datepart(yy,@Date)) )-1 RETURN @ResultENDALTER FUNCTION dbo.DTEBookedImps ( @AdEndDate datetime, @AdStartDate datetime, @EndDate datetime, @BookedTotal bigint, @ImpsDlvrdTotal bigint, @DailyDlvry bigint, @ImpsDlvrdMTD bigint, @AdSize varchar(8) )RETURNS bigintAS BEGIN Declare @Result bigint Declare @DTEImps bigint Declare @LiveDaysFromStart int Declare @LiveDaysMTD int Declare @LiveDaysRemainingMTD int Set @LiveDaysRemainingMTD = dbo.LiveDaysRemainingMTD(@EndDate,@AdEndDate) Set @LiveDaysMTD = dbo.LiveDaysMTD(@AdStartDate,@AdEndDate,@EndDate) Set @LiveDaysFromStart = dbo.LiveDaysFromStart(@AdStartDate,@AdEndDate,@EndDate) Set @DTEImps = dbo.DTEImps(@AdEndDate,@AdStartDate,@EndDate,@BookedTotal,@ImpsDlvrdTotal,@DailyDlvry) Select @Result = Convert(bigint, Case When @AdSize='720x300' Then @DTEImps Else Case When @BookedTotal=0 Then @DTEImps Else (@BookedTotal-(@ImpsDlvrdTotal-@ImpsDlvrdMTD/@LiveDaysFromStart*(@LiveDaysMTD+@LiveDaysRemainingMTD)-@ImpsDlvrdMTD)) End End ) RETURN @Result ENDALTER FUNCTION dbo.DTEImps ( @AdEndDate datetime, @AdStartDate datetime, @EndDate datetime, @BookedTotal bigint, @ImpsDlvrdTotal bigint, @DailyDlvry bigint )RETURNS bigintAS BEGIN Declare @Result int Select @Result = Convert(bigint, Case When dbo.LiveDaysRemainingMTD(@EndDate,@AdEndDate)=0 Then 0 Else Case When @ImpsDlvrdTotal>@BookedTotal And @BookedTotal>0 Then 0 Else Case When @DailyDlvry*dbo.LiveDaysRemainingMTD(@EndDate,@AdEndDate)<@BookedTotal-@ImpsDlvrdTotal Or @BookedTotal=0 Then @DailyDlvry*dbo.LiveDaysRemainingMTD(@EndDate,@AdEndDate) Else (@BookedTotal-@ImpsDlvrdTotal)/dbo.LiveDaysRemainingTotal(@EndDate,@AdEndDate)*dbo.LiveDaysRemainingMTD(@EndDate,@AdEndDate) End End End ) RETURN @Result ENDALTER FUNCTION dbo.LiveDaysFromStart ( @AdEndDate datetime, @AdStartDate datetime, @EndDate datetime )RETURNS intAS BEGIN Declare @Result int Select @Result = Convert(int, @AdEndDate- Case When @AdEndDate-@AdStartDate>dbo.BegMonth(@EndDate) Then @AdStartDate Else dbo.BegMonth(@EndDate)+1 End ) RETURN @Result ENDALTER FUNCTION dbo.LiveDaysMTD ( @AdStartDate datetime, @AdEndDate datetime, @EndDate datetime )RETURNS intASBEGINDeclare @Result intSelect @Result = Convert(int, Case When @AdStartDate<dbo.BegMonth(@EndDate) Then Case When @AdEndDate<dbo.BegMonth(@EndDate) Then 0 Else Case When @AdEndDate<@EndDate Then @AdEndDate-dbo.BegMonth(@EndDate)+1 Else @EndDate-dbo.BegMonth(@EndDate)+1 End End Else Case When @AdEndDate<@EndDate Then @AdEndDate-@AdStartDate+1 Else @EndDate-@AdStartDate+1 End End )Return @ResultENDALTER FUNCTION [dbo].[LiveDaysRemainingMTD] ( @EndDate datetime, @AdEndDate datetime)RETURNS intASBEGIN DECLARE @Result int SELECT @Result = Convert(int, Case When @AdEndDate<=@EndDate Then 0 When @AdEndDate>@EndDate And @AdEndDate<dbo.EndMonth(@EndDate) Then @AdEndDate-@EndDate When @AdEndDate>=dbo.EndMonth(@EndDate) Then dbo.EndMonth(@EndDate)-@EndDate End ) RETURN @ResultENDALTER FUNCTION LiveDaysRemainingTotal ( -- Add the parameters for the function here @EndDate datetime, @AdEndDate datetime)RETURNS intASBEGIN -- Declare the return variable here DECLARE @Result int -- Add the T-SQL statements to compute the return value here SELECT @Result = Cast(Case When @AdEndDate-@EndDate<=0 Then 0 Else @AdEndDate-@EndDate End as int) -- Return the result of the function RETURN @ResultALTER FUNCTION dbo.LiveDaysTotal ( @AdStartDate datetime, @AdEndDate datetime )RETURNS intAS BEGIN Declare @Result int Select @Result= Convert(int, Case When @AdEndDate-@AdStartDate<=0 Then 0 Else @AdEndDate-@AdStartDate End ) Return @Result ENDALTER FUNCTION dbo.PercentOfTotal ( @ImpsDlvrdMTD bigint, @TotalTargetedDelivery bigint )RETURNS realAS BEGIN Declare @Result real Select @Result = Case When @ImpsDlvrdMTD=0 Then 0 Else @ImpsDlvrdMTD/(@TotalTargetedDelivery *1.0) End RETURN @Result ENDENDThis query as it is works. You'll notice I have hard numbers plugged into some of the fields in the select statement. These are where it gets more complicated because I'm using functions within functions. The one I'm trying to do right now to replace what's currently there for [Mnth Forecast] which looks like this:SumOfImpressions Delivered + dbo.DTEImps(End Date,Start Date,@EndDate,SUM(tbl875Fixed.Booked) * dbo.PercentOfTotal(SUM(tblImpsLandedByCC.[SumOfImpressions Delivered]), SUM([Imps Targeted].[Targeted Imps])),SUM(tbl875Fixed.[Total Campaign Delivered]) * dbo.PercentOfTotal(SUM(tblImpsLandedByCC.[SumOfImpressions Delivered]), SUM([Imps Targeted].[Targeted Imps])),CASE WHEN dbo.LiveDaysMTD([Start Date] , [End Date] , @EndDate) = 0 THEN 0 ELSE SUM([SumOfImpressions Delivered]) / dbo.LiveDaysMTD([Start Date] , [End Date] , @EndDate) END)As [Mnth Forecast]
Unfortunately, because all of these numbers are inter-related, there's no way to simplify this whole thing. Can anyone get their head around this?Ted Baker