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

本文介绍如何在 SQL Server 2008 及以上版本中,通过创建示例表、视图和存储过程来处理数据并生成报表。详细展示了使用 T-SQL 创建表、插入数据、以视图方式实现数据提取、以及使用存储过程实现类似报表的动态数据展示。重点突出 SQL Server 中数据处理和报表生成的关键步骤和技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--创建示例表
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得再调整下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值