未用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 2115 C Looooops

    扩展GCD...一定要(1L<<k),不然k=31是会出错的 ....                        C Looooops Time Limit: 1000MS   Mem ...

  2. 如何配置和使用Spring框架的bean

    1. 首先在src目录下新建beans.xml文件,该文件名可更改. 2. 编辑xml文件如下,这里需要注意的是beans的表头中信息需要根据不同的版本对应的内容不同,本例中使用的spring的版本为 ...

  3. Spark之命令

    Spark之命令 1.spark运行模式有4种: a.local 多有用测试, b. standalone:spark 集群模式,使用spark自己的调度方式. c. Yarn: 对Mapreduce ...

  4. EL表达式和JSTL

    EL相关概念JSTL一般要配合EL表达式一起使用,来实现在jsp中不出现java代码段.所以我们先来学习EL表达式 EL主要用于查找作用域中的数据,然后对它们执行简单操作:它不是编程语言,甚至不是脚本 ...

  5. 【python网络编程】新浪爬虫:关键词搜索爬取微博数据

    上学期参加了一个大数据比赛,需要抓取大量数据,于是我从新浪微博下手,本来准备使用新浪的API的,无奈新浪并没有开放关键字搜索的API,所以只能用爬虫来获取了.幸运的是,新浪提供了一个高级搜索功能,为我 ...

  6. 在C语言源程序中的格式字符与空格等效

    #include <stdio.h> #\ i\ n\ c\ l\ u\ d\ e \ <\ s\ t\ d\ l\ i\ b\ .\ h\ > /* *预处理指令这里换行符会 ...

  7. 跟着百度学PHP[4]OOP面对对象编程-7-OOP的一些关键子讲解

    面对对象常用的一些关键子:http://www.cnblogs.com/xishaonian/p/6146794.html排版不是很好望见谅. THE END

  8. sublime text3 package control 安装

    1.安装 package control 按快捷键ctrl+` 或使用菜单 View->Show Console 打开控制台,然后粘贴如下安装代码 import urllib.request,o ...

  9. java定时器的几种用法[转]

                                  Timer timer =          timer.schedule(                              Sy ...

  10. 转:linux下bwa和samtools的安装与使用

    bwa的安装流程安装本软体总共需要完成以下两个软体的安装工作:1) BWA2) Samtools1.BWA的安装a.下载BWA (download from BWA Source Forge ) ht ...