我有一张列出索引/顺序,名称和值的表。例如,它看起来像这样:
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
这样做有可能吗?还是我在浪费时间?我应该参考实际的代码来做到这一点吗?还是我应该做一个功能?
我不确定从哪里开始,我希望有人可以帮助我。
先感谢您!
正如gregory建议的那样,您可以使用一个简单的窗口函数来执行此操作,该函数(在这种情况下)将基于该ID值汇总当前行之后(包括当前行)的所有行。显然,您可以采用多种不同的方式对数据进行切片,尽管我将让您自己探索:)
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 | +----+------+-----+----+