未用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)+''+right(splitbatchnum,4) where currencycode='HKD' and (Extracted='Y' or Extracted='P')
update #temp_SplitBatch set splitbatchnum=left(splitbatchnum,len(splitbatchnum)-5)+''+right(splitbatchnum,4) where currencycode='USD' and (Extracted='Y' or Extracted='P')
update #temp_SplitBatch set splitbatchnum=left(splitbatchnum,len(splitbatchnum)-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=''
End ;With Batch as(
select DataSourceID,PVBatch.BatchNum,CurrentProcess,BatchStatus,TotalChequeCount,Extracted,currencycode from PVBatch
where (DataSourceID=@DataSource or @DataSource='')
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)+''+right(PVBatch.BatchNum,4)
When PVITem.currencycode='USD' and (PVBatch.Extracted='Y' or PVBatch.Extracted='P') Then left(PVBatch.BatchNum,len(PVBatch.BatchNum)-5)+''+right(PVBatch.BatchNum,4)
When PVITem.currencycode='CNY' and (PVBatch.Extracted='Y' or PVBatch.Extracted='P') Then left(PVBatch.BatchNum,len(PVBatch.BatchNum)-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='')
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

结果集:

存储过程使用CTE 和 case when的更多相关文章

  1. 调用MYSQL存储过程实例

    PHP调用MYSQL存储过程实例 http://blog.csdn.net/ewing333/article/details/5906887 http://www.cnblogs.com/kkchen ...

  2. mysql存储过程--学习

    -- 存储过程示例一   inDROP DATABASE IF EXISTS tdemo;CREATE DATABASE tdemo CHARACTER SET=utf8; USE tdemo;CRE ...

  3. Sql Server 数据库表结构,存储过程,视图比较脚本

    顶级干货 用来比较两个数据库之间 表结构,存储过程及视图差异的存储过程,直接复制对应的存储过程,无需改动,直接在数据库中执行(传递要比较的数据库参数)即可 1.两个数据库之间存储过程及视图差异比较的存 ...

  4. QL Server 实用脚本

    use MyFirstDB; -- 主要内容 -- SQL Server 实用脚本 -- 1.case语句 -- 2.子查询 -- 3.连接查询 -- 4.脚本变量与流程控制(选择与循环等) -- 5 ...

  5. 金蝶K3 WISE BOM多级展开_BOM成本表

    /****** Object: StoredProcedure [dbo].[pro_bobang_BOMCost] Script Date: 07/29/2015 16:09:11 ******/ ...

  6. 六、K3 WISE 开发插件《直接SQL报表开发新手指导 - BOM成本报表》

    ======================== 目录: 1.直接SQL报表 ======================== 1.直接SQL报表 以BOM成本报表为例,在销售模块部署,需要购买[金蝶 ...

  7. 为什么不能用drop function add 去删除函数? 因为不能使用 mysql中的保留字!

    mysql中有很多的 保留字, 也叫关键字, 你在使用 数据库中的任何东西, 都最好是 避开这些关键字/保留字, 包括 数据库名, 表名, 字段名, 函数名, 存储过程名. 这些关键字包括: mysq ...

  8. SQL Server 对比数据库差异

    一.视图和存储过程比较 [原理]利用系统表“sysobjects"和系统表“syscomments”,将数据库中的视图和存储过程进行对比.系统表"sysobjects"之 ...

  9. [翻译]MySQL 文档: Control Flow Functions(控制流函数)

    本文翻译自13.4 Control Flow Functions Table 13.6 Flow Control Operators 名称 描述 CASE Case 运算符 IF() if/else ...

随机推荐

  1. POJ 2411 Mondriaan's Dream

    状压DP Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 9938 Accepted: 575 ...

  2. 点击验证码刷新(tp3.1)--超简单

    省略js点击刷新验证码,虽然看不懂 <img src='http://localhost/app/index.php/Index/verify/'  onclick='this.src=this ...

  3. java系列-使用maven创建web项目(二)

    推荐2个maven找jar包配置的网站,只需要搜索关键字即可找到需要的Jar包,非常方便,比如:MySQL就可以找到mysql-connect-Java.jar. http://search.mave ...

  4. Ubuntu 14 安装 “宋体,微软雅黑,WPS Office的symbol、wingdings、wingdings 2、wingdings 3、webding字体,Consolas雅黑混合版编程字体” 等 Windows 7 下的字体

    Windows平台下,“宋体”.“微软雅黑”.“Courier New(编程字体)”用的比较多,看的也习惯了.那如何在 Ubuntu下也安装这些字体呢? 操作步骤如下: 第一步:从 Windows 7 ...

  5. 怎样用Lodrunner测试WAP站点的性能(两种解决方案)

    其实用IE就可以的!!!! 1.借助opera实现对WAP站点的录制 第一:安装opera软件 第二:Lodrunner选择Web(HTTP/HTML)协议 第三:Lodrunner的Applicat ...

  6. cocos2dx中CC_CALLBACK_1等宏中this指针实际指向

    首先看代码,我在Helloworld中添加两个函数. void HelloWorld::addTarget(){ Size visibleSize = Director::getInstance()- ...

  7. js引出函数概念的案例

    js引出函数概念的案例   1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8&q ...

  8. Unity手游之路<七>角色控制器

    Unity手游之路<七>角色控制器 我们要控制角色的移动,可以全部细节都由自己来实现.控制角色模型的移动,同时移动摄影机,改变视角.当然Unity也提供了一些组件,可以让我们做更少的工作, ...

  9. Android 创建内容提供器(ContentResolver)

    如果想实现跨程序共享数据的功能,官方推荐的方式就是使用内容提供器,可以通过新建一个类去继承 ContentResolver 的方式来创建一个自己的内容提供器. ContentProvider 类中有六 ...

  10. String与InputStream互转的几种方法

    [java] view plain copy /** * 利用BufferedReader实现Inputstream转换成String <功能详细描述> * * @param in * @ ...