2013-11-25 5 views
1

У меня есть запрос, который выводит нижеагрегирования данных, чтобы получить нарастающую сумму

enter image description here

Мне нужно, чтобы получить его, чтобы обеспечить нарастающий итог с тем в март он дал бы, Что был выплачен в феврале и марте, затем на апрель февраль, март & Апр и так далее.

Никогда не сталкивайтесь с необходимостью такого рода агрегации перед SQL.

ответ

1
select 
    [monthid], 
    [month], 
    (select sum([paid]) from tbl t2 where t2.[monthid] <= t1.[monthid]) as paid 
from tbl t1 
0

Запуск итогов в 2008 году - это боль. SQL Fiddle, похоже, снова отправился в МВД, но вот упрощенный пример того, как вы можете это сделать.

DECLARE @ t1 ТАБЛИЦА (monthid INT, MTH VARCHAR (10), платных десятичной (18,2), running_paid десятичного (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 

EDIT: Как Богдан 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.

+0

Хотя метод 'quirky update' является самым быстрым методом, он имеет множество ограничений. Вы должны опубликовать ссылки на статьи sqlservercentral.com по этому вопросу. –

1

Вы можете проверить this question и мой answer на нем. Оказывается, что рекурсивное общее табличное выражение является самым быстрым способом, чтобы получить текущую сумму в 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) 
1
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 

Test Data

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 
Смежные вопросы