一个存储过程实例,慢慢再加注释吧!仅供自己学习

本文介绍了一个SQL存储过程ppque_tu,用于统计指定日期范围内生产线上的缺陷情况。通过创建临时表并根据不同的筛选条件(如生产线名称、站点、班次等)统计各类缺陷的数量及比例。
 1 USE [rfiddbHFKT]
 2 GO
 3 /****** Object:  StoredProcedure [dbo].[ppque_tu]    Script Date: 07/21/2017 23:36:40 ******/
 4 SET ANSI_NULLS OFF
 5 GO
 6 SET QUOTED_IDENTIFIER OFF
 7 GO
 8 ALTER PROCEDURE [dbo].[ppque_tu]              
 9 (            
10   @fdatebegin  varchar(50),  ---开始日期            
11   @fdateend      varchar(50),  ---结束日期            
12   @linename   varchar(50),  ---生产线            
13   @zhandian   varchar(50),  ----站点            
14   @banci   varchar(50),       ---班次            
15   @strnum varchar(5)           ----数量  默认数量是10            
16 )            
17 AS                
18   declare @sqltext varchar(1500)                
19   declare @fcount int             
20   declare @sumTotal int           
21   ---缺陷饼图              
22               
23   --生成临时表              
24   create table #que_cx(              
25     class_name nvarchar(200),              
26     sernsum int,          
27      rate decimal(18,2))              
28               
29   --统计数据 添加查询条件              
30     insert into #que_cx(class_name,sernsum)              
31     select c.class_name, count(c.class_name) as sernsum                
32     from tjianyan a,tsaomiao b, z_que_class c               
33     where a.sern = b.sern and a.zd_bh = b.zd_bh and a.que_class = c.class_id               
34       and a.ddate  between convert(datetime,@fdatebegin,120)           
35     and convert(datetime,@fdateend,120)         
36     and(case when @linename='' then 1 else CHARINDEX(@linename,b.linename) end)>0               
37      and  a.zd_bh like '%'+@zhandian+'%'    
38      and(case when @banci='' then 1 else CHARINDEX(@banci,a.bc_id) end)>0               
39      group by c.class_name order by sernsum desc                
40        
41   --如果小于设置数量 不显示其余项          
42   select @sumTotal=sum(sernsum) from #que_cx          
43   select @fcount = count(*) from #que_cx          
44    update #que_cx  set rate=sernsum*1.00/@sumTotal * 100  
45         
46   if @fcount>@strnum             
47       set  @sqltext = 'select top ' + @strnum + '  class_name,''a'' as aa,sernsum,rate  from  #que_cx  '               
48                        +' union '              
49                        +' select  ''其余项'' as class_name ,''b'' as aa, isnull(sum(sernsum),0) as sernsum,sum(rate)  from  #que_cx '               
50                        +' where class_name not in ( select top ' + @strnum + '  class_name from  #que_cx ) '      
51                       +'  order by aa,sernsum desc'               
52    else             
53           set  @sqltext = 'select  class_name,''a'' as aa,sernsum,rate  from  #que_cx  '               
54                        +' order by aa,sernsum,rate  desc'               
55                                    
56 exec(@sqltext)

 

转载于:https://www.cnblogs.com/kaifang1028/p/7220068.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值