我有两张这样的 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/