2015-04-09 4 views
1

У меня есть простой вопрос, но для меня это сложно решить. Я хотел бы подвести конкретный столбец, пока он не достигнет предела и сбрасывает его сам. (SQL 2012)Общая сумма с максимальным лимитом

Допустим, предел 50

- List item 
- Value Total 
- 10  10 
- 20  30 
- 30  60 
- 40  50 (60-limit) + the current row value 
- 2   2 
- 3   5 
- 10  15 
- 25  40 
- 15  55 
- 5   10 (55-limit) + the current row value 

Большое спасибо.

+0

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

ответ

3

Это должно сделать это, если у вас есть SQL Server 2012 или более поздней версии:

DECLARE @Table TABLE (Id INT, ListItem INT); 
INSERT INTO @Table VALUES (1, 10); 
INSERT INTO @Table VALUES (2, 20); 
INSERT INTO @Table VALUES (3, 30); 
INSERT INTO @Table VALUES (4, 40); 
INSERT INTO @Table VALUES (5, 2); 
INSERT INTO @Table VALUES (6, 3); 
INSERT INTO @Table VALUES (7, 10); 
INSERT INTO @Table VALUES (8, 25); 
INSERT INTO @Table VALUES (9, 15); 
INSERT INTO @Table VALUES (10, 5); 
WITH RunningTotal AS (
SELECT Id, ListItem, SUM(ListItem) OVER (ORDER BY Id) % 50 AS RT FROM @Table) 
SELECT 
    rt.Id, 
    rt.ListItem, 
    CASE WHEN rt.RT < rt2.RT THEN rt.RT + 50 ELSE rt.RT END AS RunningTotal 
FROM 
    RunningTotal rt 
    LEFT JOIN RunningTotal rt2 ON rt2.Id = rt.Id - 1 
ORDER BY 
    rt.Id; 

хитрый бит, позволяющий номера переполнить 50 один раз, в противном случае это было бы тривиально.

Результаты:

Id LI RunningTotal 
1 10 10 
2 20 30 
3 30 60 
4 40 50 
5 2 2 
6 3 5 
7 10 15 
8 25 40 
9 15 55 
10 5 10 
+0

Спасибо! Это сработало отлично! –

1
create table running_totals 
(
    id int identity(1,1), 
    val int 

) 

insert into  running_totals 

select 1 union all 
select 20 union all 
select 10 union all 
select 30 union all 
select 50 union all 
select 10 union all 
select 11 union all 
select 22 union all 
select 40 union all 
select 60 union all 
select 20 union all 
select 10 union all 
select 15 

declare cur_run_tot cursor for select id,val from running_totals order by id asc 
declare @id int ,@val int,@runtot int 
open cur_run_tot 
create table #RunTot 
(
    id int,val int, runtot int 
) 

fetch next from cur_run_tot into @id,@val 

while @@FETCH_STATUS = 0 
begin 


    if @runtot is null or @[email protected] > 50 
     set @runtot = @val 
    else 
     set @runtot = @runtot+ @val 

    insert into #RunTot 
    select @id,@val,@runtot 

    fetch next from cur_run_tot into @id,@val 
end 

select id as ID, val as Current_Value, runtot as Running_Total from #RunTot 

drop table #RunTot 
deallocate cur_run_tot 
Смежные вопросы