Как получить накопительную сумму - PullRequest
154 голосов
/ 23 января 2010
declare  @t table
    (
        id int,
        SomeNumt int
    )

insert into @t
select 1,10
union
select 2,12
union
select 3,3
union
select 4,15
union
select 5,23


select * from @t

вышеупомянутый выбор возвращает мне следующее.

id  SomeNumt
1   10
2   12
3   3
4   15
5   23

Как мне получить следующее

id  srome   CumSrome
1   10  10
2   12  22
3   3   25
4   15  40
5   23  63

Ответы [ 14 ]

0 голосов
/ 12 июня 2017

Без использования какого-либо типа совокупного оклада JOIN для человека, полученного с помощью следующего запроса:

SELECT * , (
  SELECT SUM( salary ) 
  FROM  `abc` AS table1
  WHERE table1.ID <=  `abc`.ID
    AND table1.name =  `abc`.Name
) AS cum
FROM  `abc` 
ORDER BY Name
0 голосов
/ 24 мая 2016

Решение SQL, которое сочетает в себе «строки между незанятым PRECEDING и CURRENT ROW» и «SUM», сделало именно то, что я хотел достичь. Большое вам спасибо!

Если это может кому-нибудь помочь, вот мой случай. Я хотел накапливать +1 в столбце всякий раз, когда создатель определяется как «Some Maker» (пример). Если нет, то нет приращения, но отображается предыдущий результат приращения.

Итак, этот кусок SQL:

SUM( CASE [rmaker] WHEN 'Some Maker' THEN  1 ELSE 0 END) 
OVER 
(PARTITION BY UserID ORDER BY UserID,[rrank] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Cumul_CNT

Позволил мне получить что-то вроде этого:

User 1  Rank1   MakerA      0  
User 1  Rank2   MakerB      0  
User 1  Rank3   Some Maker  1  
User 1  Rank4   Some Maker  2  
User 1  Rank5   MakerC      2
User 1  Rank6   Some Maker  3  
User 2  Rank1   MakerA      0  
User 2  Rank2   SomeMaker   1  

Объяснение выше: счетчик "Some Maker" начинается с 0, Some Maker найден, и мы делаем +1. Для пользователя 1 MakerC найден, поэтому мы не делаем +1, но вместо этого вертикальный отсчет Some Maker привязывается к 2 до следующего ряда. Разделение выполняется пользователем, поэтому, когда мы меняем пользователя, кумулятивный счет возвращается к нулю.

Я на работе, я не хочу никаких заслуг в этом ответе, просто скажите спасибо и покажите мой пример на случай, если кто-то окажется в такой же ситуации. Я пытался объединить SUM и PARTITION, но удивительный синтаксис «ROWS МЕЖДУ UNBOUNDED PRECEDING И CURRENT ROW» выполнил задачу.

Спасибо! Groaker

0 голосов
/ 17 февраля 2014

Попробуйте это:

CREATE TABLE #t(
 [name] varchar NULL,
 [val] [int] NULL,
 [ID] [int] NULL
) ON [PRIMARY]

insert into #t (id,name,val) values
 (1,'A',10), (2,'B',20), (3,'C',30)

select t1.id, t1.val, SUM(t2.val) as cumSum
 from #t t1 inner join #t t2 on t1.id >= t2.id
 group by t1.id, t1.val order by t1.id
0 голосов
/ 28 июня 2013

Попробуйте это

select 
    t.id,
    t.SomeNumt, 
    sum(t.SomeNumt) Over (Order by t.id asc Rows Between Unbounded Preceding and Current Row) as cum
from 
    @t t 
group by
    t.id,
    t.SomeNumt
order by
    t.id asc;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...