T-SQL 存储过程

prk/彭仁夔      08-09-02        转载注明出处。

在开发中,我们经常要用到这样的统计

 

根据用户输入的日期,把每个月的备份表的数据和正在使用的表中的综合起来统计。假如2008-05-11到2008-08-01,那么就包含5,6,7,8四张备份表还有正在使用的表,加起5张表。这是要统计的所有的数据。

 

对于统计又有要求,分情况来统计各种情况的总计,但是有的特殊情况要统计其明细。

如下图:

 T-sql日期转换不兼容。还有对运行的sql的长度也有一定的限制。

 

 

prk/彭仁夔      08-09-02        转载注明出处。

 

 

ALTER PROCEDURE [dbo].[UP_TSMReceivedDailyReport]
@StartTime varchar(100),
@EndTime    varchar(100),
@OrgAddrs  varchar(1000)='',
@MsgType_IDs  varchar(1000)=''
 AS 
     declare @where  varchar(1000)
     declare @startMonth  int 
     declare @endMonth int 
     declare @tempMonth int
     declare @generalSql varchar(1000)
     declare @tempSql varchar(1000)
     declare @tempSql1 varchar(3000)
     declare @tempTotal varchar(3000)
     declare @tempUndeal varchar(3000)
     declare @tempdealing varchar(3000)
     declare @tempdealed varchar(3000)
     declare @temp1 varchar(3000)
     declare @temp2 varchar(3000)
     declare @temp3 varchar(3000)
     declare @temp4 varchar(3000)
     declare @mm int
     declare @mm1 int
  /*
    declare @StartTime varchar(100)
    declare @EndTime    varchar(100)
    declare @OrgAddrs  varchar(1000)
    declare @MsgType_IDs  varchar(1000)
 
   set @StartTime ='2008-05-05'
   set  @EndTime  ='2008-07-07'
   set  @OrgAddrs =''
   set  @MsgType_IDs =''
*/
    set  @startMonth=Month(@StartTime)
    set  @endMonth =Month(@EndTime)
    set  @tempMonth=@startMonth
    set  @tempSql=' '
    set  @tempSql1=' '
    set  @temp1=' '
    set  @temp2=' '
    set  @temp3=' '
    set  @temp4=' '
    set  @where=' where recvTime>='''+CAST(@StartTime as varchar(20))+''' and recvTime<='''+CAST(@EndTime as varchar(20))+'''  '

    if @OrgAddrs!=''
     begin
      set @where=@where+' '+ ' and OrgAddr in '+@OrgAddrs+' '
      end
    
    if @MsgType_IDs!=''
       begin
       set @where=@where+' '+ ' and MsgType_ID in '+@MsgType_IDs+' '
       end
     print @where
     set @generalSql=' select RecvSM_ID,User_ID,MsgType_ID,OrgAddr ,DestAddr, cast(RecvTime as DateTime) RecvTime,
       SM_Content,DealSign,cast(DealTime as DateTime) DealTime,IsWait,ReMsgType_ID,SendSM_Content   
         from T_SMReceived '+@where+' and DealSign<>4  and (DealSign<>8 and iswait<>0) and (DealSign<>3 and IsWait<>0)'
       print @generalSql

create table #temp  (RecvSM_ID int, 
                      User_ID int, 
                      MsgType_ID int, 
                     OrgAddr varchar(128), 
                     DestAddr varchar(128), 
                     RecvTime datetime, 
                     SM_Content varchar(6000), 
                     DealSign tinyint, 
                     DealTime datetime,
                     IsWait bit, 
                     ReMsgType_ID int ,
                     SendSM_Content varchar(6000) )
   
    insert into #temp exec (@generalSql)
  
while @tempMonth<=@endMonth
       begin      
   set @tempSql='select RecvSM_ID,User_ID,MsgType_ID,OrgAddr ,DestAddr, cast(RecvTime as DateTime) RecvTime,
       SM_Content,DealSign,cast(DealTime as DateTime) DealTime,IsWait,ReMsgType_ID,SendSM_Content   from T_SMReceived_'+Cast(@tempMonth as varchar(2))+'  '+@where+' '
     insert into #temp  exec (@tempSql)       
       
     set @tempMonth= @tempMonth+1
     end   
     
      select @mm= count(*) from #temp
    print 'the temp table have:'+cast(@mm as varchar(100))

     set @temp1='select  msgtype_id  ,convert(varchar(10),recvtime,120) recvtime , total=count(*)     from #temp  '
     set @temp2=' group by  convert(varchar(10),recvtime,120), msgtype_id  '
     set @tempTotal = @temp1+''+@temp2
     print @tempTotal
     set @tempUndeal = @temp1+' where (iswait=1 and DealSign=0) or DealSign=2  or (iswait=1 and DealSign=8) '+@temp2
     print @tempUndeal
     set @tempdealing =@temp1+' where (iswait=1 and DealSign=1) or (iswait=1 and DealSign=9) '+@temp2
     print @tempdealing
     set @tempdealed =@temp1+' where (iswait=0 and DealSign=3) or (iswait=0 and DealSign=4) '+@temp2
     print @tempdealed

     set @temp3='select a.MsgType_ID , a.RecvTime,a.total,
     (select undeal= case  when b.total IS NULL  then 0 else b.total end) undeal ,
     (select dealing= case  when c.total IS NULL  then 0 else c.total end) dealing,
     (select dealed= case  when d.total IS NULL  then 0 else d.total end) dealed,
      undealDetail=null,dealingDetail=null,dealedDetail=null from ('+@tempTotal+') a left join ('
        +@tempUndeal+') b on a.msgtype_id=b.msgtype_id and a.recvtime=b.recvtime left join ('+
        @tempdealing+' ) c on a.msgtype_id=c.msgtype_id and a.recvtime=c.recvtime left join ( '
        +@tempdealed+') d on a.msgtype_id=d.msgtype_id and a.recvtime=d.recvtime'
    
   print '#temp1 SQL: '+ @temp3

create table #temp1  (
                     MsgType_ID int,                      
                     RecvTime varchar(10), 
                     total int,
                     undeal int,                      
                     dealing int,                     
                     dealed int,
                     undealDetail varchar(1000),
                     dealingDetail varchar(1000),
                     dealedDetail varchar(1000),                    
                     ) 

 insert into #temp1   exec(@temp3)


      select @mm1= count(*) from #temp1
print 'the #templ have :'+cast(@mm1 as varchar(100))

declare finalReport cursor 
  for select MsgType_ID,convert(varchar(10),recvtime,120) RecvTime ,dealed from #temp1
   open finalReport

     declare @MsgType_IDf int
     declare @RecvTimef varchar(10)
     declare @dealedf int
      print  'start tatal one record';
     fetch next from finalReport into @MsgType_IDf, @RecvTimef ,@dealedf
      while(@@fetch_status=0)
         begin

             declare my_cursor cursor 
              
              for  select a.msgtype_id ,a.recvtime,a.size,a.reMsgType_ID,b.ReMsgTypeName from
                     (select msgtype_id,count(*) size, convert(varchar(10),recvtime,120) recvtime,reMsgType_ID from #temp 
                       where convert(varchar(10),recvtime,120)=@RecvTimef and msgtype_id=@MsgType_IDf and (iswait=0 and (DealSign=3 or DealSign=4))   group by  convert(varchar(10),recvtime,120), msgtype_id,reMsgType_ID) a left join T_ReMsgType b
                      on a.reMsgType_ID=b.reMsgType_ID order by a.msgtype_id

                open my_cursor

                 declare @msgtype_id int
                 declare @recvtime varchar(10)
                 declare @reMsgType_ID int
                 declare @ReMsgTypeName varchar(500)
                 declare @dealedDetail varchar(500)
                 declare @size int
                 declare @flag int

                 set @flag=0
                 set @dealedDetail='总数:'+Cast(@dealedf as varchar(5))+' (其中 '
                  print  'start deal one record';
               fetch next from my_cursor into @msgtype_id,@recvtime,@size,@reMsgType_ID,@ReMsgTypeName
                 while(@@fetch_status=0)
                       begin

                         set @dealedDetail= @dealedDetail+@ReMsgTypeName+': '+                 
                         Cast((select undeal= case  when @size IS NULL  then 0  else @size end) as varchar(5))+','
                          set @flag=1  
                  
                         fetch next from my_cursor into @msgtype_id,@recvtime,@size,@reMsgType_ID,@ReMsgTypeName
                       end

                   if @flag=0
                       begin
                       set @dealedDetail=substring(@dealedDetail,0,len(@dealedDetail)-3)
                       end
                    else 
                       begin
                         set @dealedDetail=substring(@dealedDetail,0,len(@dealedDetail))+')'
                       end
                close my_cursor 
                DEALLOCATE my_cursor
          update #temp1 set dealedDetail= @dealedDetail  where convert(varchar(10),recvtime,120)=@RecvTimef and msgtype_id=@MsgType_IDf 
            print  'have update one record';

     fetch next from finalReport into @MsgType_IDf, @RecvTimef ,@dealedf
          end
    close finalReport
    DEALLOCATE finalReport

 select c.*,d.MsgTypeName from #temp1 c left join T_MsgType d on c.msgtype_id=D.msgtype_id  order by c.RecvTime,c.msgtype_id

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值