Кумулятивное значение текущей строки + суммы предыдущих строк
Как бы вы сделали, чтобы преобразовать столбец в таблицу из этого:
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. какой метод вы бы выбрали.
Ответы
Ответ 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;