It's pretty hairy so here goes:Alter Procedure LAP_aggResults @StartDate smalldatetime, @PeriodType char(1), @IndustryID int, @OptionalFilterValueID UNIQUEIDENTIFIER = '00000000-0000-0000-0000-000000000000'AsDeclare @OFWhere varchar(1000)If @OptionalFilterValueID = '00000000-0000-0000-0000-000000000000'BEGIN set @OFWhere = ''ENDelseBEGIN Declare @OptionalFilter varchar(1000), @OptionalFilterID varchar(1000) select @OptionalFilter = OFValue, @OptionalFilterID = OptionalFilterID from OptionalFilterValue where OptionalFilterValueID = @OptionalFilterValueID select @OFWhere = case @OptionalFilterID when '4D15FC62-60E2-4EDD-9C8C-9DDC9978FC61' then ' and ConfigType = '+@OptionalFilter+' ' when '6FB9E30B-22F2-4268-82B2-CD85431A66E4' then ' and GrossMass between '+cast((cast(@OptionalFilter as int)-10)*1000 as varchar)+' and '+cast(cast(@OptionalFilter as int)*1000 as varchar)+' ' endENDDeclare @Industry varchar(20)Select @Industry = IndustryName from Industry where IndustryID = @IndustryIDDeclare @FullWeighbridge varchar(100), @FullAggResults varchar(100)set @FullWeighbridge = 'LAP_'+@Industry+'.dbo.FullWeighbridge'set @FullAggResults = 'LAP_'+@Industry+'.dbo.AggResults'Declare @Period varchar(1000)select @Period = case @PeriodType when 'Y' then 'datepart(year, GrossDate) = datepart(year, '''+cast(@StartDate as varchar)+''')' when 'M' then '(datepart(year, GrossDate) = datepart(year, '''+cast(@StartDate as varchar)+''')) and (datepart(month, GrossDate) = datepart(month, '''+cast(@StartDate as varchar)+'''))' when 'W' then '(datepart(year, GrossDate) = datepart(year, '''+cast(@StartDate as varchar)+''')) and (datepart(week, GrossDate) = datepart(week, '''+cast(@StartDate as varchar)+'''))' when 'D' then '(datepart(year, GrossDate) = datepart(year, '''+cast(@StartDate as varchar)+''')) and (datepart(month, GrossDate) = datepart(month, '''+cast(@StartDate as varchar)+''')) and (datepart(day, GrossDate) = datepart(day, '''+cast(@StartDate as varchar)+'''))' endDeclare @Where varchar(1000)set @Where = ' where '+@Period+' '+@OFWhereDeclare @OFValue varchar(150)set @OFValue = @OptionalFilterValueIDDeclare @Proc5 varchar(1000), @TotTop5 decimal(9,2)create table #temp (TotTop int) set @Proc5 = 'Insert into #temp Select Count(*) from 'set @Proc5 = @Proc5+'(Select top 5 percent GrossMass from '+@FullWeighbridge+' '+@Whereset @Proc5 = @Proc5+'order by GrossMass desc) a'--print 'Proc5 ' + @Proc5Select @TotTop5 = TotTop from #tempDeclare @Proc varchar(8000)set @Proc = 'Insert into '+@FullAggResults+' 'set @Proc = @Proc+'select '''+convert(varchar, @StartDate, 112)+''', ''D'', '''+@OFValue+''', ''TOP'', 'set @Proc = @Proc+'(Select Avg(GrossMass) from( 'set @Proc = @Proc+' select top 5 percent GrossMass from '+@FullWeighbridge+' '+@Whereset @Proc = @Proc+' and GrossMass <= isnull(MaxLegal, 56000)*1.05 order by GrossMass desc) as v1) as topGross 'set @Proc = @Proc+',(Select Avg(TareMass) from( 'set @Proc = @Proc+' select top 5 percent TareMass from '+@FullWeighbridge+' '+@Whereset @Proc = @Proc+' and GrossMass <= isnull(MaxLegal, 56000)*1.05 order by TareMass desc) as v2) as topTare 'set @Proc = @Proc+',(Select Avg(Payload) from( 'set @Proc = @Proc+' select top 5 percent (GrossMass-TareMass) Payload from '+@FullWeighbridge+' '+@Whereset @Proc = @Proc+' and GrossMass <= isnull(MaxLegal, 56000)*1.05 order by Payload desc) as v3) as topPayload 'set @Proc = @Proc+',(Select stdev(Payload) from( 'set @Proc = @Proc+' select top 5 percent (GrossMass-TareMass) Payload from '+@FullWeighbridge+' '+@Whereset @Proc = @Proc+' order by Payload desc) as v4) as stdevPayload 'set @Proc = @Proc+',(Select Avg(MillQueue) from( 'set @Proc = @Proc+' select top 5 percent cast(datediff(hour,arrivaldate,grossdate)as decimal(9,2)) MillQueue from '+@FullWeighbridge+' '+@Whereset @Proc = @Proc+' order by MillQueue asc) as v5) as avgMillQueue 'set @Proc = @Proc+',(Select Avg(Offload) from( 'set @Proc = @Proc+' select top 5 percent cast(datediff(mi,grossdate,taredate)as decimal(9,2)) Offload from '+@FullWeighbridge+' '+@Whereset @Proc = @Proc+' order by Offload asc) as v6) as avgOffload 'set @Proc = @Proc+',(Select count(*) from( 'set @Proc = @Proc+' select top 5 percent WBID from '+@FullWeighbridge+' '+@Whereset @Proc = @Proc+' ) as v5) as NoDeliveries 'set @Proc = @Proc+',(select cast(Count(*) as decimal(9,2))/'+cast(@TotTop5 as varchar)+' Pctover from 'set @Proc = @Proc+'(Select top 5 percent GrossMass from '+@FullWeighbridge+' '+@Whereset @Proc = @Proc+' and (GrossMass between isnull(MaxLegal, 56000)*1.015 and isnull(MaxLegal, 56000)*1.05) 'set @Proc = @Proc+'order by GrossMass desc) a) as Pctover 'set @Proc = @Proc+',(select cast(Count(*) as decimal(9,2))/'+cast(@TotTop5 as varchar)+' PctUnder from 'set @Proc = @Proc+'(Select top 5 percent GrossMass from '+@FullWeighbridge+' '+@Whereset @Proc = @Proc+' and (GrossMass <= isnull(MaxLegal, 56000)*0.985) 'set @Proc = @Proc+'order by GrossMass desc) a) as PctUnder 'set @Proc = @Proc+',(select cast(Count(*) as decimal(9,2))/'+cast(@TotTop5 as varchar)+' PctSevereOverloads from 'set @Proc = @Proc+'(Select top 5 percent GrossMass from '+@FullWeighbridge+' '+@Whereset @Proc = @Proc+' and (GrossMass >= isnull(MaxLegal, 56000)*1.05) 'set @Proc = @Proc+'order by GrossMass desc) a) as PctSevereOverloads 'set @Proc = @Proc+',(select cast(Count(*) as decimal(9,2))/'+cast(@TotTop5 as varchar)+' PctOnTargetLoads from 'set @Proc = @Proc+'(Select top 5 percent GrossMass from '+@FullWeighbridge+' '+@Whereset @Proc = @Proc+' and (GrossMass between isnull(MaxLegal, 56000)*0.985 and isnull(MaxLegal, 56000)*1.015) 'set @Proc = @Proc+'order by GrossMass desc) a) as PctOnTargetLoads 'set @Proc = @Proc+',(Select Avg(ExtentOver) from( 'set @Proc = @Proc+' select top 5 percent (GrossMass-(isnull(MaxLegal, 56000)*1.015)) ExtentOver from '+@FullWeighbridge+' '+@Where+' and GrossMass >= (isnull(MaxLegal, 56000)*1.015) 'set @Proc = @Proc+' order by ExtentOver asc) as v7) as avgExtentOver 'set @Proc = @Proc+',(Select Avg(ExtentUnder) from( 'set @Proc = @Proc+' select top 5 percent ((isnull(MaxLegal, 56000)*0.985)-GrossMass) ExtentUnder from '+@FullWeighbridge+' '+@Where+' and GrossMass <= (isnull(MaxLegal, 56000)*0.985) 'set @Proc = @Proc+' order by ExtentUnder asc) as v8) as avgExtentUnder 'print 'Proc ' + @Procexec(@Proc)Declare @Proc2 varchar(8000)set @Proc2 = 'Insert into '+@FullAggResults+' 'set @Proc2 = @Proc2+'Select '''+convert(varchar, @StartDate, 112)+''', ''D'', '''+@OFValue+''', ''AVG'', avg(GrossMass) AvgGross, 'set @Proc2 = @Proc2+' avg(TareMass) AvgTare, 'set @Proc2 = @Proc2+' avg(GrossMass-TareMass) Payload, 'set @Proc2 = @Proc2+' stdev(GrossMass-TareMass) StDevPayload, 'set @Proc2 = @Proc2+' avg(cast(datediff(mi,arrivaldate,grossdate) as decimal(9,2)))/60 AvgMillQueue, 'set @Proc2 = @Proc2+' avg(cast(datediff(mi,grossdate,taredate) as decimal(9,2)))/60 AvgOffload, 'set @Proc2 = @Proc2+' Count(WBID) NoDeliveries, 'set @Proc2 = @Proc2+' sum(case when GrossMass between (isnull(MaxLegal, 56000)*1.015) and (isnull(MaxLegal, 56000)*1.05) then 1 else 0 end)/cast(count(WBID) as decimal(9,2)) PctOver, 'set @Proc2 = @Proc2+' sum(case when GrossMass <= (isnull(MaxLegal, 56000)*0.985) then 1 else 0 end)/cast(count(WBID) as decimal(9,2)) PctUnder, 'set @Proc2 = @Proc2+' sum(case when GrossMass >= (isnull(MaxLegal, 56000)*1.05) then 1 else 0 end)/cast(count(WBID) as decimal(9,2)) PctSevereOverloads, 'set @Proc2 = @Proc2+' sum(case when GrossMass between (isnull(MaxLegal, 56000)*0.985) and (isnull(MaxLegal, 56000)*1.015) then 1 else 0 end)/cast(count(WBID) as decimal(9,2)) PctOnTargetLoads, 'set @Proc2 = @Proc2+' avg(case when GrossMass > (isnull(MaxLegal, 56000)*1.015) then GrossMass - (isnull(MaxLegal, 56000)*1.015) else null end) ExtentOver, 'set @Proc2 = @Proc2+' avg(case when GrossMass < (isnull(MaxLegal, 56000)*0.985) then (isnull(MaxLegal, 56000)*1.015) - GrossMass else null end) ExtentUnder 'set @Proc2 = @Proc2+'from LAP_Timber.dbo.FullWeighbridge 'set @Proc2 = @Proc2+@Where+' 'print 'Proc2 ' + @Proc2exec(@Proc2)
Most of the top part of the procedure is to build up the where clause and the appropriate variables for the Dynamic SQL so it can run on various databases.The dynamic sql Proc produces a whole bunch of agregated results for the top 5% of deliveries. Proc3 produces average values across all deliveries.