一个统计连续合格的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