Промежуточный итог добавлен в следующий раздел - PullRequest
0 голосов
/ 11 ноября 2019
declare @Temp table 
(    
  Grp int,
  Bal float,
  [Value] float    
)     

declare @Amt  float =1000;

Insert into @Temp(Grp,[Value])    
Values(1,10),(1,5),(1,15)
,(2,20),(2,5),(2,15)
,(3,50),(3,50)

select Grp,@Amt as Amount,Value,Bal from @Temp

Требуемый выход:

Grp Amount Value Bal
1   1000    10  1000
1   1000    5   1000
1   1000    15  1000
2   1000    20  1030  ---(10+5+15)
2   1000    5   1030
2   1000    15  1030
3   1000    50  1070 ---- (20+5+15)
3   1000    50  1070

Баланс, рассчитанный на основе промежуточного итогового значения «Значение» группы 1, добавленного к группе 2, и промежуточного итога группы 2, добавленного к балансу группы 3 и вскоре

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

Пожалуйста, помогите эффективно получить требуемый результат. Я использую SQL Server 2017

1 Ответ

2 голосов
/ 11 ноября 2019

Один метод - outer apply:

select t.*, t.amount + coalesce(t2.value, 0)
from @temp t outer apply
     (select sum(t2.value) as value
      from @temp t2
      where t2.grp < t.grp
     ) t2;

Возможно, более эффективно использовать агрегацию и промежуточную сумму:

select t.*,
       (1000 + tt.running_value)
from @temp t join
     (select t.grp, sum(value) as value,
             sum(sum(value)) over (order by grp) - sum(value) as running_value
      from @temp t
      group by grp
     ) tt
     on t.grp = tt.grp;

К сожалению, SQL Server не полностью поддерживаетrange оконные рамы, поэтому я не думаю, что есть удобный способ сделать это только с помощью оконных функций. Но у group by, вероятно, будет гораздо лучшая производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...