小编典典

从另一个表中的特定点开始的SQL中的SUM值

sql

我有一张列出索引/顺序,名称和值的表。例如,它看起来像这样:

TABLE1:
ID | NAME | VALUE
1  | A    | 2
2  | B    | 5
3  | C    | 2
4  | D    | 7
5  | E    | 0

现在,我还有另一个表,其中包含一个随机的NAME列表。它只会显示A,B,C,D或E。根据名称是什么,我想计算到达E所需的所有值的总和。这有意义吗?

因此,举例来说,我的表格如下所示:

TABLE2:
NAME
D
B
A

我想在NAME旁边的另一列显示总和。所以D将有7,因为下一个事件是E。B将必须是5、2和7的总和,因为B是5,C是2,而D是7。而A将有2的总和。
5、3和7,依此类推。

希望这很容易理解。

实际上,除了连接两个表并获取NAME的当前值外,我没有什么其他的。但是我不确定如何增加等等,然后继续增加?

SELECT T2.NAME, T1.VALUE
FROM Table1 T1
LEFT JOIN Table2 T2 ON T1.NAME = T2.NAME

这样做有可能吗?还是我在浪费时间?我应该参考实际的代码来做到这一点吗?还是我应该做一个功能?

我不确定从哪里开始,我希望有人可以帮助我。

先感谢您!


阅读 182

收藏
2021-04-28

共1个答案

小编典典

正如gregory建议的那样,您可以使用一个简单的窗口函数来执行此操作,该函数(在这种情况下)将基于该ID值汇总当前行之后(包括当前行)的所有行。显然,您可以采用多种不同的方式对数据进行切片,尽管我将让您自己探索:)


declare @t table(ID int,Name nvarchar(50),Val int);
insert into @t values(1,'A',2),(2,'B',5),(3,'C',2),(4,'D',7),(5,'E',0);

select ID      -- The desc makes the preceding work the right way. This is 
        ,Name  -- essentially shorthand for "sum(Val) over (order by ID rows between current row and unbounded following)"
        ,Val   -- which is functionally the same, but a lot more typing...
        ,sum(Val) over (order by ID desc rows unbounded preceding) as s 
from @t
order by ID;

将输出:

+----+------+-----+----+
| ID | Name | Val | s  |
+----+------+-----+----+
|  1 | A    |   2 | 16 |
|  2 | B    |   5 | 14 |
|  3 | C    |   2 |  9 |
|  4 | D    |   7 |  7 |
|  5 | E    |   0 |  0 |
+----+------+-----+----+
2021-04-28