帮朋友写的一个累计SQL代码,有分季度,和总累计

--创建示例表
Create Table T1
(_Date Varchar(10),RunTime INT)
Go
Insert T1 (_Date,RunTime)
  Values ('2015.04',10),('2015.05',20),('2015.06',30),('2015.07',40),('2015.08',25),('2015.09',35),('2015.10',15),('2015.11',55)

--注意在字符串中,月份以 04、05表示,否则会影响后续的计算顺序,比如字符串 '2015.4'>'2015.11',但实际上4月要小于11月

 Go

--以视图方式实现,以方便下游当成表来提取数据
Create View dbo.vT1
As
  With C As
  (Select _Date,LEFT(_Date,4) as YY,(Cast(Right(_Date,2) as Int)-1)/3+1 as Qt,RunTime,
          ROW_NUMBER() OVER (ORDER BY _Date) as RN
     From dbo.T1)
  Select _Date,RunTime,
         (Select Sum(RunTime) as A From C as C2 Where YY=C.YY and Qt=C.Qt and RN<=C.RN) as A,
         (Select Sum(RunTime) as A From C as C3 Where RN<=C.RN) as B
   From C
Go
Select * From dbo.vT1 Order By _Date

GO

--以SP实现,像报表一样
Create Procedure RepData
As
 Declare @A INT=0,@B INT=0,@Qt INT=0
 Select _Date,(Cast(Right(_Date,2) as Int)-1)/3+1 as Qt, --季度值
        RunTime,@A as A,@B as B INTO #T
   From T1
 --建聚集索引是为了排序
 Create Clustered Index CX_T_99999 On #T (_Date)
 --逐行更新累计值
 Update #T
   Set @A=Case When @Qt=Qt Then @A+RunTime Else RunTime End,
       @B=@B+RunTime,
       A=@A,B=@B,@Qt=Qt
 Select _Date,RunTime,A,B
   From #T Order By _Date
Go

--执行:
Exec RepData


SQL Server 2008及以上版本支持,2005/2000得再调整下

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值