码迷,mamicode.com
首页 > 其他好文 > 详细

存储过程使用CTE 和 case when

时间:2014-06-20 14:09:23      阅读:284      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   code   http   ext   

未用SQL CTE and case when:

ALTER PROCEDURE [dbo].[usp_rptDropboxBatchSummary1]
    @DataSource     varchar(10)=ALL,
    @BatchNum        varchar(8)=ALL,
    @CurrentProcess varchar(10)=ALL
AS
BEGIN
    SET NOCOUNT ON;
    --select * from PVBatch
    --select * from pvitem
    --0.set the source table 
    select IDENTITY(int,1,1) as id,DataSourceID,BatchNum,CurrentProcess,BatchStatus,TotalChequeCount,0 as RejectChequeCount,0 as AcceptChequeCount,
            0 as HostPostedCount,convert(varchar(10),‘‘) as SplitBatchNum,Currencycode,0 as SplitBatchAcceptCount,convert(decimal(18,2), 0) as SplitBatchClearingChqAmt,Extracted
            into #temp_RptBatchs from PVBatch with(nolock) where 1=1
            --where (DataSourceID=@DataSource or @DataSource=‘ALL‘)
            --and (BatchNum=@BatchNum or @BatchNum=‘ALL‘)
            --and (CurrentProcess=@CurrentProcess or @CurrentProcess=‘ALL‘)
    --1.get the conditon data from PVItem
    select  i.BatchNum,i.CurrencyCode,ItemStatus,HostPostStatus,isnull(ClearingChqAmt,0) as ClearingChqAmt,b.Extracted into #temp_batchItems from PVItem i with(nolock) 
        join  PVBatch b on i.batchnum=b.batchnum
        where ItemType=C and i.batchnum in (select batchnum from #temp_RptBatchs)
    --2.get the RejectChequeCount and AcceptChequeCount and HostPostedCount
    --3.set the RejectChequeCount
    update a set a.RejectChequeCount=b.Rcount from #temp_RptBatchs a,
        (select count(*) as Rcount,batchnum  from #temp_batchItems where itemstatus=Reject group by batchnum) b where a.batchnum=b.batchnum
    --4.get the AcceptChequeCount
    --5.set the AcceptChequeCount
    update a set a.AcceptChequeCount=b.Rcount from #temp_RptBatchs a,
    (select count(*) as Rcount,batchnum  from #temp_batchItems where itemstatus=Accept group by batchnum) b where a.batchnum=b.batchnum
    --6.get the HostPostedCount
    --7.set the HostPostedCount
    update a set a.HostPostedCount=b.Rcount from #temp_RptBatchs a,
        (select count(*) as Rcount,batchnum from #temp_batchItems where HostPostStatus=P group by batchnum)  b where a.batchnum=b.batchnum
    --8.to get the split batch table group by the currency code
    select batchNum,batchNum as SplitBatchNum,CurrencyCode,sum(ClearingChqAmt) as SplitClearingChqAmt,0 as SplitBatchAcceptCount,Extracted into #temp_SplitBatch
         from #temp_batchItems  group by CurrencyCode,batchNum,Extracted
    --9.set the SplitBatchAcceptCount
    update a set a.SplitBatchAcceptCount=b.AcceptCurrency from 
    (select batchNum,count(itemstatus) as AcceptCurrency,CurrencyCode from #temp_batchItems where itemstatus=Accept group by CurrencyCode,batchNum) as b,#temp_SplitBatch a
    where a.batchnum=b.batchnum and a.CurrencyCode=b.CurrencyCode
    --10.process the splitbatchnum(120001 --> 130001 (HKD)140001 (USD)150001 (CNY) update the back fifth)
    update #temp_SplitBatch set splitbatchnum=left(splitbatchnum,len(splitbatchnum)-5)+3+right(splitbatchnum,4) where currencycode=HKD and (Extracted=Y or Extracted=P)
    update #temp_SplitBatch set splitbatchnum=left(splitbatchnum,len(splitbatchnum)-5)+4+right(splitbatchnum,4) where currencycode=USD and (Extracted=Y or Extracted=P)
    update #temp_SplitBatch set splitbatchnum=left(splitbatchnum,len(splitbatchnum)-5)+5+right(splitbatchnum,4) where currencycode=CNY and (Extracted=Y or Extracted=P)
    --11.update and insert the split data into the Rpt table
    --select * from #temp_RptBatchs
    --select * from #temp_SplitBatch
    Select * from #temp_RptBatchs left join #temp_SplitBatch on #temp_RptBatchs.BatchNum = #temp_SplitBatch.BatchNum     
    drop table #temp_RptBatchs
    drop table #temp_batchItems
    drop table #temp_SplitBatch
END

使用SQL CTE  and case when:

ALTER PROCEDURE [dbo].[usp_rptDropboxBatchSummary]
    @DataSource     varchar(10)=ALL,
    @BatchNum        varchar(8)=ALL,
    @CurrentProcess varchar(10)=ALL
AS
BEGIN
    
    IF @DataSource=ALL
    Begin
        Set @DataSource=0
    End
    
    
    ;With Batch as(
    select DataSourceID,PVBatch.BatchNum,CurrentProcess,BatchStatus,TotalChequeCount,Extracted,currencycode
        
            from PVBatch
            where (DataSourceID=@DataSource or @DataSource=0)
            and (isnull(@BatchNum,‘‘)=‘‘ or BatchNum=@BatchNum or @BatchNum=ALL)
            and (CurrentProcess=@CurrentProcess or @CurrentProcess=ALL)
    ),
     Item as(
    select BatchNum
            ,Sum(Case When itemstatus=Reject Then 1 Else 0 End) as RejectCount
        ,Sum(Case When itemstatus=Accept Then 1 Else 0 End) as AcceptCount
        ,Sum(Case When HostPostStatus=P Then 1 Else 0 End) as HostPostCount
        
            from PVITem
        Group By BatchNum    
    ),
    PItem as(
    select PVBatch.BatchNum ,PVITem.currencycode,PVBatch.Extracted,
            sum(ClearingChqAmt) as SplitClearingChqAmt
        , Case When PVITem.currencycode=HKD and (PVBatch.Extracted=Y or PVBatch.Extracted=P) Then left(PVBatch.BatchNum,len(PVBatch.BatchNum)-5)+3+right(PVBatch.BatchNum,4)
               When PVITem.currencycode=USD and (PVBatch.Extracted=Y or PVBatch.Extracted=P) Then left(PVBatch.BatchNum,len(PVBatch.BatchNum)-5)+4+right(PVBatch.BatchNum,4)
               When PVITem.currencycode=CNY and (PVBatch.Extracted=Y or PVBatch.Extracted=P) Then left(PVBatch.BatchNum,len(PVBatch.BatchNum)-5)+5+right(PVBatch.BatchNum,4)
          else PVBatch.BatchNum
          End as SplitBatchNum
          ,Sum(Case When itemstatus=Accept then 1 else 0 end) as SplitAcceptCount
            from PVBatch Left join PVITem
            on PVBatch.BatchNum = PVItem.BatchNum            
            where (PVBatch.DataSourceID=@DataSource or @DataSource=0)
            and  (@BatchNum=ALL or PVBatch.BatchNum=@BatchNum or isnull(@BatchNum,‘‘)=‘‘)
            and (PVBatch.CurrentProcess=@CurrentProcess or @CurrentProcess=ALL)

        Group By PVBatch.BatchNum,PVITem.currencycode,PVBatch.Extracted    
    )
    
    select
    Batch.*, IsNull(Item.RejectCount,0) RejectCount, IsNull(Item.AcceptCount,0) AcceptCount, IsNull(Item.HostPostCount,0) HostPostCount
    , Isnull(PITem.currencycode, Batch.currencycode) currencycode, Isnull(PITem.SplitClearingChqAmt,0) SplitClearingChqAmt,PITem.SplitAcceptCount, PItem.SplitBatchNum
    , Case When row_number() over( PARTITION BY Batch. BatchNum order by SplitBatchNum) = 1 then 0 else 1 end  groupflag
     from Batch Left join Item 
    on Batch. BatchNum = ITem. BatchNum
    Left join PITem
    on Batch. BatchNum = PITem.BatchNum
    order by Batch. BatchNum,PItem.SplitBatchNum
    
    End

结果集:

bubuko.com,布布扣

存储过程使用CTE 和 case when,布布扣,bubuko.com

存储过程使用CTE 和 case when

标签:style   class   blog   code   http   ext   

原文地址:http://www.cnblogs.com/tylertang/p/3795970.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!