Подтвердить что ты не робот

Кумулятивное значение текущей строки + суммы предыдущих строк

Как бы вы сделали, чтобы преобразовать столбец в таблицу из этого:

ColumnA   ColumnB
2           a
3           b
4           c
5           d
1           a

:

ColumnA          ColumnB
3                 a
6(=3+3)           b   
10(=4+3+3)        c   
15(=5+4+3+3)      d 

Мне интересно видеть esp. какой метод вы бы выбрали.

4b9b3361

Ответ 1

Как это:

;WITH cte
AS
(
   SELECT ColumnB, SUM(ColumnA) asum 
   FROM @t 
   gROUP BY ColumnB

), cteRanked AS
(
   SELECT asum, ColumnB, ROW_NUMBER() OVER(ORDER BY ColumnB) rownum
   FROM cte
) 
SELECT (SELECT SUM(asum) FROM cteRanked c2 WHERE c2.rownum <= c1.rownum),
  ColumnB
FROM cteRanked c1;

Это должно дать вам:

ColumnA    ColumnB
3             a
6             b
10            c
15            d

Вот живая демонстрация

Ответ 2

Обычно я старался не пытаться это сделать, но следующие совпадения, которые вы просили:

declare @T table (ColumnA int,ColumnB char(1))
insert into @T(ColumnA,ColumnB) values
(2    ,       'a'),
(3   ,        'b'),
(4  ,         'c'),
(5 ,          'd'),
(1,           'a')

;With Bs as (
    select distinct ColumnB from @T
)
select
    SUM(t.ColumnA),b.ColumnB
from
    Bs b
        inner join
    @T t
        on
            b.ColumnB >= t.ColumnB
group by
    b.ColumnB

Результат:

            ColumnB
----------- -------
3           a
6           b
10          c
15          d

Для небольших наборов данных это будет нормально. Но для больших наборов данных обратите внимание, что последняя строка таблицы основана на получении SUM по всему содержимому исходной таблицы.

Ответ 3

Не уверен, что это оптимально, но как насчет (SQL Fiddle):

SELECT x.A + COALESCE(SUM(y.A),0) ColumnA, x.ColumnB
FROM
(
    SELECT SUM(ColumnA) A, ColumnB
    FROM myTable
    GROUP BY ColumnB
) x
LEFT OUTER JOIN
(
    SELECT SUM(ColumnA) A, ColumnB
    FROM myTable
    GROUP BY ColumnB
) y ON y.ColumnB < x.ColumnB
GROUP BY x.ColumnB, x.A

Ответ 4

create table #T
(
  ID int primary key,
  ColumnA int,
  ColumnB char(1)
);

insert into #T
select row_number() over(order by ColumnB),
       sum(ColumnA) as ColumnA,
       ColumnB
from YourTable
group by ColumnB;

with C as
(
  select ID,
         ColumnA,
         ColumnB
  from #T
  where ID = 1
  union all
  select T.ID,
         T.ColumnA + C.ColumnA,
         T.ColumnB
  from #T as T
    inner join C
      on T.ID = C.ID + 1
)
select ColumnA,
       ColumnB 
from C
option (maxrecursion 0);

drop table #T;

Ответ 5

DECLARE @t TABLE(ColumnA INT, ColumnB VARCHAR(50));

    INSERT INTO @t VALUES
    (2,           'a'),
    (3  ,         'b'),
    (4   ,        'c'),
    (5    ,       'd'),
    (1     ,      'a');

    ;WITH cte
    AS
    (
        SELECT  ColumnB, sum(ColumnA) value,ROW_NUMBER() OVER(ORDER BY ColumnB) sr_no FROM @t group by ColumnB    
    )

    SELECT ColumnB
    ,SUM(value) OVER (   ORDER BY  ColumnB  ROWS BETWEEN UNBOUNDED PRECEDING  AND  0  PRECEDING) 
    FROM cte c1;

Ответ 6

Попробуйте приведенный ниже скрипт,

DECLARE @T TABLE(ColumnA INT, ColumnB VARCHAR(50));

INSERT INTO @T VALUES
    (2, 'a'),
    (3, 'b'),
    (4, 'c'),
    (5, 'd'),
    (1, 'a');

SELECT  SUM(ColumnA) OVER(ORDER BY ColumnB) AS ColumnA,ColumnB
FROM    (   SELECT  SUM(ColumnA) AS ColumnA,ColumnB
            FROM    @T  GROUP BY ColumnB )T

Ответ 7

Используя SQL SERVER? ТАК

Предположим, у вас есть таблица с 3 столбцами C_1, C_2, C_3 и упорядоченная по C_1. Просто используйте [Over (Order By C_1)], чтобы добавить столбец для суммы C_3:

Выберите C_1, C_2, C_3, Sum (C_3) Over (Заказ по C_1)

если вы тоже хотите номер строки, сделайте это так же:

Выберите Row_Number() Over (Порядок по C_1), C_1, C_2, C_3, Сумма (C_3) более (Порядок по C_1)

Ответ 8

Вы можете использовать ниже простой оператор выбора для того же

SELECT COLUMN_A, COLUMN_B, 
(SELECT SUM(COLUMN_B) FROM #TBL T2 WHERE T2.ID  <= T1.ID) as SumofPreviousRow FROM #TBL T1;