Sql 聚合数据以获取运行总数
我有一个查询,输出以下内容 我需要得到它,以提供一个运行的总数,以便为三月份,它会给出什么是在二月和三月支付,然后为四月二月,三月和四月等Sql 聚合数据以获取运行总数,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个查询,输出以下内容 我需要得到它,以提供一个运行的总数,以便为三月份,它会给出什么是在二月和三月支付,然后为四月二月,三月和四月等 以前在SQL中从未遇到过需要这种聚合的情况。在2008年运行总计是一种痛苦。SQLFiddle似乎又一次陷入了混乱,但这里有一个简单的例子,说明了如何做到这一点 select [monthid], [month], ( select sum([paid]) from tbl t2 where t2.[monthid] <= t1.[m
以前在SQL中从未遇到过需要这种聚合的情况。在2008年运行总计是一种痛苦。SQLFiddle似乎又一次陷入了混乱,但这里有一个简单的例子,说明了如何做到这一点
select
[monthid],
[month],
( select sum([paid]) from tbl t2 where t2.[monthid] <= t1.[monthid] ) as paid
from tbl t1
声明@t1表
蒙希德国际酒店,
mth varchar10,
支付小数点18,2,
运行支付小数18,2
insert into @t1
values (1,'JAN-13',35.00,0)
,(2, 'FEB-13',35.00,0)
,(3,'MAR-13',35.00,0)
declare @running decimal(18,2)
set @running= 0
update @t1 set running_paid = @running, @running= @running+ paid
select
*
from
@t1
这将给你:
ID MTH PAID RUNNING_PAID
1 JAN-13 35.00 35.00
2 FEB-13 35.00 70.00
3 MAR-13 35.00 105.00
编辑:
正如Bogdan Sahlean指出的,这是一个非常时髦的小流程。您还可以使用光标:
declare @t1 TABLE
(monthid int,
mth varchar(10),
paid decimal(18,2)
)
insert into @t1
values (1,'JAN-13',35.00)
,(2, 'FEB-13',35.00)
,(3,'MAR-13',35.00)
declare @running table
(monthid int,
mth varchar(10),
paid decimal(18,2),
running_paid decimal(18,2))
declare c cursor
for select monthid,mth,paid from @t1
open c
declare @Id int
declare @Mth varchar(10)
declare @paid decimal(18,2)
declare @Running_Total decimal(18,2)
set @Running_Total = 0
fetch next from c
into @Id,@Mth,@paid
WHILE @@FETCH_STATUS = 0
begin
fetch next from c
into @Id,@Mth,@paid
select @Running_Total = @Running_Total + @paid --Here's this version's hack for running total
insert into @running values (@Id,@Mth,@paid,@Running_Total)
end
select
*
from
@running
它们都有点臭。在SQL 2012中,这要容易得多。您可以在上面查看和查看。结果表明,在SQL Server<2012中,递归公共表表达式是获得运行总计的最快方法
因此,在您的情况下,它可能类似于:
with cte as
(
select T.MonthID, T.Month, T.Paid, T.Paid as Running_Paid
from Table1 as T
where T.MonthID = 118
union all
select T.MonthID, T.Month, T.Paid, T.Paid + C.Running_Paid as Running_Paid
from cte as C
inner join Table1 as T on T.MonthID = C.MonthID + 1
)
select *
from cte
option (maxrecursion 0)
虽然古怪的更新方法是最快的方法,但它有很多限制。您应该发布指向sqlservercentral.com的有关此主题的文章的链接。
SELECT
T.MonthId
,T.[Month]
,T.Value
,RT.runningTotal
from Table_Name T
CROSS APPLY
(
SELECT SUM(value) as runningTotal
FROM Table_Name
WHERE MonthId <= T.MonthId
) as RT
order by T.MonthId
declare @t1 TABLE (Monthid int, month varchar(10), Value decimal(18,2))
insert into @t1
values
(1,'JAN-13',35.00)
,(2, 'FEB-13',35.00)
,(3,'MAR-13',35.00)
,(4,'APR-13',35.00)
,(5,'JUN-13',35.00)
,(6,'Jul-13',35.00)
,(7,'Aug-13',35.00)
SELECT
T.MonthId
,T.[Month]
,T.Value
,RT.runningTotal
from @t1 T
CROSS APPLY
(
SELECT SUM(value) as runningTotal
FROM @t1
WHERE MonthId <= T.MonthId
) as RT
order by T.MonthId
MonthId Month Value runningTotal
1 JAN-13 35.00 35.00
2 FEB-13 35.00 70.00
3 MAR-13 35.00 105.00
4 APR-13 35.00 140.00
5 JUN-13 35.00 175.00
6 Jul-13 35.00 210.00
7 Aug-13 35.00 245.00