我们如何在不使用的情况下获取SQL Server中每列的总和;使用cte?

时间:2017-06-07 04:11:23

标签: sql-server sql-server-2008 sql-server-2012

如何在第3列中将每行的总和乘以两行和?

这是一个截图:

enter image description here

你可以看到id 1 sum是10但是id 2 sum是10 + 50 = 60 第三笔和是60 + 100 = 160,依此类推。

使用Cte它对我来说很好。我需要;with cte表示虽然代码我需要总和

示例如下所示

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

INSERT INTO @t 
VALUES (10,'1'), (50,'2'), (100,'3'), (5,'4'), (45,'5');

;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) AS ColumnA, 
    ColumnB
FROM
    cteRanked c1;

2 个答案:

答案 0 :(得分:1)

一个不需要显式分析函数的选项是使用相关子查询来计算运行总计:

SELECT
    t1.ID,
    t1.Currency,
    (SELECT SUM(t2.Currency) FROM yourTable t2 WHERE t2.ID <= t1.ID) AS Sum
FROM yourTable t1

<强>输出:

enter image description here

在这里演示:

Rextester

答案 1 :(得分:1)

看起来你需要一个简单的运行总计。

在SQL Server 2012及更高版本中,有一种简单有效的方法来计算运行总计。您可以使用SUM(...) OVER (ODER BY ...),如下例所示:

示例数据

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

INSERT INTO @t 
VALUES (10,'1'), (50,'2'), (100,'3'), (5,'4'), (45,'5');

<强>查询

SELECT
    ColumnB
    ,ColumnA
    ,SUM(ColumnA) OVER (ORDER BY ColumnB 
        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS SumColumnA
FROM @t
ORDER BY ColumnB;

<强>结果

+---------+---------+------------+
| ColumnB | ColumnA | SumColumnA |
+---------+---------+------------+
|       1 |      10 |         10 |
|       2 |      50 |         60 |
|       3 |     100 |        160 |
|       4 |       5 |        165 |
|       5 |      45 |        210 |
+---------+---------+------------+

对于SQL Server 2008及更低版本,您需要使用相关的子查询或简单的游标,如果表格很大,这可能会更快。