连续合格的计算 T-SQL

一个统计连续合格的T-SQL例子,用在SQL2008,各位请留意,这个方法可以拓展到其他统计连续如何,连续如何的地方。

转载请注明出处,联系我: [email protected]
本人热衷于数据库技术及算法的研究,志同道合之士, 欢迎探讨

CREATE proc [dbo].[proc_KanBanContinuousQualifiedCount]
@ProductModel nvarchar(100)
as
begin
    select t1.ProductModel,t1.DisplaySequence,t1.WorkStation,t1.OutputTarget_LL,t1.OutputTarget_UL
	,t1.ShouldReached,t1.IsDataFromOutputStation,t2.Time,t2.Qty
	,case when (t2.Qty>=t1.OutputTarget_LL and t2.Qty<=t1.OutputTarget_UL) then 1 else 0 end 'Qualified'
	into #r1
	 from [dbo].[LineBaseData] t1
	left join [dbo].[ActualOutput] t2 on t1.ProductModel=t2.ProductModel and t1.WorkStation=t2.WorkStation
	where t1.ProductModel=@ProductModel 
	and t2.Date=cast(GETDATE() as date) --自動選取當天的數據
	order by [Time],DisplaySequence;	

	 --計算SMT連續達標次數
	 select t1.ProductModel,t1.Time,sum(Qualified) SMT_QualifiedCount 
	 into #r9
	 from 
	 #r1 t1 where IsDataFromOutputStation=0
	 group by t1.ProductModel,t1.Time;
	 select ROW_NUMBER() over (order by t1.Time) Seq,t1.* into #r10 from #r9 t1;
	 --select * from #r10;
	 declare @MaxSMTContinuousCount int;
	 set @MaxSMTContinuousCount=0;
	 declare @n int;
	 declare @i int;
	 declare @flag int;
	 set @i=1;
	 declare @LastSMT_QualifiedCount int;
	 declare @ThisSMT_QualifiedCount int;
	 select @n=count(*) from #r10;
	 alter table #r10 add flag int;
	 while(@i<=@n)
	 begin
	      set @LastSMT_QualifiedCount=-1;
		  set @ThisSMT_QualifiedCount=-1;
		  set @flag=-1;
	      if(@i=1)
		  begin
		      update #r10 set flag=1 where Seq=@i;
		  end
		  else
		  begin
		      select @LastSMT_QualifiedCount=SMT_QualifiedCount,@flag=flag from #r10 where Seq=@i-1;
			  select @ThisSMT_QualifiedCount=SMT_QualifiedCount from #r10 where Seq=@i;
			  if(@LastSMT_QualifiedCount=@ThisSMT_QualifiedCount and @LastSMT_QualifiedCount=4)
			  begin
			      update #r10 set flag=@flag where Seq=@i;
			  end
			  else
			  begin
			      update #r10 set flag=@flag+1 where Seq=@i;
			  end
		  end
		  set @i=@i+1;
	 end
	 select t1.ProductModel,t1.SMT_QualifiedCount,t1.flag,count(*) SMTContinuousCount 
	 into #r11
	 from #r10 t1 where SMT_QualifiedCount=4 
	 group by t1.ProductModel,t1.SMT_QualifiedCount,t1.flag;
	 --select * from #r10;
	 select @MaxSMTContinuousCount=isnull(max(SMTContinuousCount),0) from #r11;
	 --print 'SMT最大連續合格:'+cast(@MaxSMTContinuousCount as nvarchar);
	 select 1 Seq,cast(N'SMT 4個工位都達標的最大連續次數' as nvarchar(100)) ContinuousName,
	 @MaxSMTContinuousCount ContinuousCount
	 into #Continuous;

	 --計算EP連續達標次數
	 declare @MaxEP_ContinuousCount int;
	 set @MaxEP_ContinuousCount=0;
	 select t1.ProductModel,t1.Time,sum(Qualified) EP_QualifiedCount 
	 into #r12
	 from 
	 #r1 t1 where IsDataFromOutputStation=1
	 group by t1.ProductModel,t1.Time;
	 select ROW_NUMBER() over (order by t1.Time) Seq,t1.* into #r13 from #r12 t1;
	 --select * from #r12;
	 declare @LastEP_QualifiedCount int;
	 declare @ThisEP_QualifiedCount int;
	 set @n=0;
	 select @n=count(*) from #r13;
	 alter table #r13 add flag int;
	 set @i=1;
	 while(@i<=@n)
	 begin
	      set @LastEP_QualifiedCount=-1;
		  set @ThisEP_QualifiedCount=-1;
		  set @flag=-1;
	      if(@i=1)
		  begin
		      update #r13 set flag=1 where Seq=@i;
		  end
		  else
		  begin
		      select @LastEP_QualifiedCount=EP_QualifiedCount,@flag=flag from #r13 where Seq=@i-1;
			  select @ThisEP_QualifiedCount=EP_QualifiedCount from #r13 where Seq=@i;
			  if(@LastEP_QualifiedCount=@ThisEP_QualifiedCount and @LastEP_QualifiedCount=10)
			  begin
			      update #r13 set flag=@flag where Seq=@i;
			  end
			  else
			  begin
			      update #r13 set flag=@flag+1 where Seq=@i;
			  end
		  end
		  set @i=@i+1;
	 end
	 --select * from #r13;
	 select t1.ProductModel,t1.EP_QualifiedCount,t1.flag,count(*) EP_ContinuousCount 
	 into #r14
	 from #r13 t1 where EP_QualifiedCount=10 
	 group by t1.ProductModel,t1.EP_QualifiedCount,t1.flag;
	 select @MaxEP_ContinuousCount=isnull(max(EP_ContinuousCount),0) from #r14;
	 --print 'EP最大連續合格:'+cast(@MaxEP_ContinuousCount as nvarchar);

	 insert into #Continuous values(2,N'EP 10個工位都達標的最大連續次數',@MaxEP_ContinuousCount)
	 --SMT_EP連續合格
	 --select * from #r1;
	 declare @SMT_MaxEP_ContinuousCount int;
	 set @SMT_MaxEP_ContinuousCount=0;
	 select t1.ProductModel,t1.Time,sum(Qualified) SMT_EP_QualifiedCount 
	 into #r15
	 from 
	 #r1 t1 group by t1.ProductModel,t1.Time;
	 select ROW_NUMBER() over (order by t1.Time) Seq,t1.* into #r16 from #r15 t1;
	 --select * from #r12;

	 declare @LastSMT_EP_QualifiedCount int;
	 declare @ThisSMT_EP_QualifiedCount int;
	 set @n=0;
	 select @n=count(*) from #r16;
	 alter table #r16 add flag int;
	 set @i=1;
	 while(@i<=@n)
	 begin
	      set @LastSMT_EP_QualifiedCount=-1;
		  set @ThisSMT_EP_QualifiedCount=-1;
		  set @flag=-1;
	      if(@i=1)
		  begin
		      update #r16 set flag=1 where Seq=@i;
		  end
		  else
		  begin
		      select @LastSMT_EP_QualifiedCount=SMT_EP_QualifiedCount,@flag=flag from #r16 where Seq=@i-1;
			  select @ThisSMT_EP_QualifiedCount=SMT_EP_QualifiedCount from #r16 where Seq=@i;
			  if(@LastSMT_EP_QualifiedCount=@ThisSMT_EP_QualifiedCount and @LastSMT_EP_QualifiedCount=14)
			  begin
			      update #r16 set flag=@flag where Seq=@i;
			  end
			  else
			  begin
			      update #r16 set flag=@flag+1 where Seq=@i;
			  end
		  end
		  set @i=@i+1;
	 end
	 --select * from #r13;
	 select t1.ProductModel,t1.SMT_EP_QualifiedCount,t1.flag,count(*) SMT_EP_ContinuousCount 
	 into #r17
	 from #r16 t1 where SMT_EP_QualifiedCount=14 
	 group by t1.ProductModel,t1.SMT_EP_QualifiedCount,t1.flag;
	 select @SMT_MaxEP_ContinuousCount=isnull(max(SMT_EP_ContinuousCount),0) from #r17;
	 --print 'SMT EP最大連續合格:'+cast(@SMT_MaxEP_ContinuousCount as nvarchar);
	 insert into #Continuous values (3,N'SMT EP 14個工位都達標的最大連續次數',@SMT_MaxEP_ContinuousCount);
	 select ContinuousName,ContinuousCount from #Continuous order by Seq;
end
GO
发布了10 篇原创文章 · 获赞 3 · 访问量 642

猜你喜欢

转载自blog.csdn.net/qq_34677276/article/details/104523128