Sam*_*Sam 16 sql sql-server sql-server-2008 cumulative-sum
如何从表中转换表中的列:
ColumnA ColumnB
2 a
3 b
4 c
5 d
1 a
Run Code Online (Sandbox Code Playgroud)
对此:
ColumnA ColumnB
3 a
6(=3+3) b
10(=4+3+3) c
15(=5+4+3+3) d
Run Code Online (Sandbox Code Playgroud)
我很有兴趣看到esp.你会选择什么方法.
Mah*_*mal 14
像这样:
;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;
Run Code Online (Sandbox Code Playgroud)
这应该给你:
ColumnA ColumnB
3 a
6 b
10 c
15 d
Run Code Online (Sandbox Code Playgroud)
我通常会避免尝试这样做,但以下内容符合您的要求:
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
Run Code Online (Sandbox Code Playgroud)
结果:
ColumnB
----------- -------
3 a
6 b
10 c
15 d
Run Code Online (Sandbox Code Playgroud)
对于小数据集,这没关系.但是对于较大的数据集,请注意表的最后一行依赖于获取SUM原始表的整个内容.
尝试下面的脚本,
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
Run Code Online (Sandbox Code Playgroud)
不确定这是否是最佳的,但是如何(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
Run Code Online (Sandbox Code Playgroud)