我有一个列出索引/顺序、名称和值的表。例如,它看起来像这样:
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。根据 NAME 是什么,我想计算到达 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
这样做有可能吗?还是我在浪费时间?我应该引用实际代码来做到这一点吗?还是应该做一个函数?
我不确定从哪里开始,我希望有人能帮助我。
提前致谢!
最佳答案
查询分为两部分;一开始很难看出这一点,所以我将逐一介绍。
第 1 步:获取滚动总和
将 table1 连接到自身以获取任何大于自身的字母:
select *
from table1 t1
inner join table1 t2 on t2.name >= t1.name
order by t1.name
这会产生下表
+ -- + ---- + ----- + -- + ---- + ----- +
| id | name | value | id | name | value |
+ -- + ---- + ----- + -- + ---- + ----- +
| 1 | A | 2 | 1 | A | 2 |
| 1 | A | 2 | 2 | B | 5 |
| 1 | A | 2 | 3 | C | 2 |
| 1 | A | 2 | 4 | D | 7 |
| 1 | A | 2 | 5 | E | 0 |
| 2 | B | 5 | 2 | B | 5 |
| 2 | B | 5 | 3 | C | 2 |
| 2 | B | 5 | 4 | D | 7 |
| 2 | B | 5 | 5 | E | 0 |
| 3 | C | 2 | 3 | C | 2 |
| 3 | C | 2 | 4 | D | 7 |
| 3 | C | 2 | 5 | E | 0 |
| 4 | D | 7 | 4 | D | 7 |
| 4 | D | 7 | 5 | E | 0 |
| 5 | E | 0 | 5 | E | 0 |
+ -- + ---- + ----- + -- + ---- + ----- +
请注意,如果我们按 t1 中的名称进行分组,我们可以通过对 t2 中的值求和来获得滚动总和。这个查询
select t1.name,
SUM(t2.value) as SumToE
from table1 t1
inner join table1 t2
on t2.name >= t1.name
group by t1.name
给我们我们想要的滚动总和
+ ---- + ------ +
| name | sumToE |
+ ---- + ------ +
| A | 16 |
| B | 14 |
| C | 9 |
| D | 7 |
| E | 0 |
+ ---- + ------ +
注意:这等同于使用窗口函数对集合求和,但通过这种连接技术更容易直观地看到您在做什么。
第 2 步:加入滚动总和
现在你有了每个字母的滚动总和,你只需将它加入到 table2 中以获得你想要的字母
select t1.*
from table2 t2
inner join (
select t1.name,
SUM(t2.value) as SumToE
from table1 t1
inner join table1 t2
on t2.name >= t1.name
group by t1.name
) t1 on t1.name = t2.name
结果:
+ ---- + ------ +
| name | sumToE |
+ ---- + ------ +
| A | 16 |
| B | 14 |
| D | 7 |
+ ---- + ------ +
关于sql - SQL 中的 SUM 值从另一个表中的特定点开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42536762/