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

标签 sql sql-server database sum subquery

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

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/

相关文章:

php - 如何从 mysql 数据库中完美排序

java - 在 MS SQL Server 2005 中创建 Java 存储过程

php - 如何检查另一个表的最后 N 行中是否存在值?

django - 导入错误: import dj_database_url ImportError: No module named 'dj_database_url'

java - JOOQ store() 不返回 ResultSet

php - 我应该为我的案例将 com-sep 数据存储在数据库中吗?

sql - Postgres : If we select a computed column multiple times, Postgres会一次又一次地计算它吗?

mysql - 在单个查询中从同一列不同的 WHERE 获得 2 个不同的结果

java - Android Java 连接到 SQL Server 2008

SQL - 如何在树级数据结构中查找值