Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 聚合数据以获取运行总数_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

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