mysql - 查找另一个表中某一列的总值?(使用 join 或其他函数)

标签 mysql sql sql-server join

我有两张这样的 table 表1

Group      ID         submit_date
1          153        2011-08-22
1          158        2011-12-02
1          245        2013-02-22
2          325        2014-01-20
2          285        2015-01-22
3          425        2016-04-22 
3          655        2017-02-22

表2

ID         as_date       amount
153        2011-09-01    500
153        2011-10-01    400
153        2011-11-15    350 
153        2012-01-25    250
153        2012-02-15    200
158        2012-01-02    10000
158        2013-05-02    8000
325        2014-02-20    5000
325        2014-03-20    4000
325        2014-04-20    3000

表2中表1的每个ID有多个记录。我想查找表1中每个ID的总金额。应付总金额等于当前ID之前提交的同一组中所有ID的总金额。仅当 as_date 较新且仍小于提交日期时才应使用到期金额。

示例:

  • ID 153:在此之前未提交 ID,到期金额 = 0
  • ID 158:ID 153 之前提交,2011-11-15 是我们有 350 美元到期金额的最新 as_date(2011-11-15 就在 ID 158 提交日期(2011-12-02)之前)
  • ID 245:组1中有两个ID在此ID之前已提交。 应付金额应为 200+10000 :

    153        2012-02-15    200
    158        2012-01-02    10000
    

as_of_date 早于 ID 245 提交日期(2013-02-22)

结果

Group      ID         submit_date    Total_due_so_far
1          153        2011-08-22     0
1          158        2011-12-02     350
1          245        2013-02-22     10000+200
2          325        2014-01-20     0 (no ID submitted before for Group 2)
2          285        2015-01-22     3000
3          425        2016-04-22     0 (no ID submitted before for Group 3)
3          655        2017-02-22     0 (no ID submitted before for Group 3)

最佳答案

到目前为止,MySql 还不支持分析函数,因此必须用普通 SQL 创建这样一个怪物查询。它不会很快:

SELECT y.group, id, submit_date, coalesce( SUM( amt ), 0 ) As Total_due_so_far
FROM (
   SELECT x.group, id, submit_date,
          ( SELECT amount FROM table2 t2
            WHERE t2.id = id12
            AND t2.as_date <= x.submit_dateeee
            ORDER BY as_date DESC
            LIMIT 1
           ) As amt
    FROM (
      SELECT t11.group, t11.id as id, t11.submit_date, t12.id as id12,
             max( t2.as_date ) as submit_dateeee
      FROM table1 t11
      LEFT JOIN table1 t12
      ON t11.id <> t12.id AND t11.submit_date > t12.submit_date AND t11.group = t12.group
      LEFT JOIN table2 t2
      ON t2.id = t12.id AND t2.as_date < t11.submit_date
      GROUP BY t11.id, t11.submit_date, t12.id
   ) x
) y
GROUP BY y.group, id, submit_date
order by 1,2
;

演示:http://sqlfiddle.com/#!9/e130e/38

| group |  id |          submit_date | Total_due_so_far |
|-------|-----|----------------------|------------------|
|     1 | 153 | 2011-08-22T00:00:00Z |                0 |
|     1 | 158 | 2011-12-02T00:00:00Z |              350 |
|     1 | 245 | 2013-02-22T00:00:00Z |            10200 |
|     2 | 285 | 2015-01-22T00:00:00Z |             3000 |
|     2 | 325 | 2014-01-20T00:00:00Z |                0 |
|     3 | 425 | 2016-04-22T00:00:00Z |                0 |
|     3 | 655 | 2017-02-22T00:00:00Z |                0 |

关于mysql - 查找另一个表中某一列的总值?(使用 join 或其他函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48953186/

相关文章:

sql-server - 如何避免在多线程应用程序中重复记录? [复制]

sql - 如何在 microsoft sql server 上的有限时间范围内从同一个人获取 2 笔交易?

php - 如何在php中显示数据库中的日期到输入类型=日期

mysql - Go 中的 MySQL 错误

c# - 如何获得使用 ExecuteNonQuery() 时发生的错误消息?

mysql - 如何在 JOINED 表中使用 FIND_IN_SET?

sql-server - 更新 : Auto Update Date/Time Field 时

mysql - 存储过程中 RLIKE 和 LIKE 的奇怪行为

PHP While 循环仅获取第一行结果

SQL Server - 如何填充缺失的列值