两个表之间重叠日期的Mysql Sum列

时间:2017-09-16 12:38:01

标签: mysql sql

表A按天计算每个库存量:

  +---+------------+----------+-------------+
  |id | Stock_id   | amount   |  Date       |
  +---+------------+----------+-------------+
  | 1 |          1 |      100 | 2017-09-05  |
  | 2 |          1 |      200 | 2017-09-06  |
  | 3 |          1 |      300 | 2017-09-07  |
  | 4 |          1 |      200 | 2017-09-08  |
  | 5 |          1 |      200 | 2017-09-09  |
  | 6 |          1 |      200 | 2017-09-10  |
  | 7 |          2 |      300 | 2017-09-06  |
  +---+------------+----------+-------------+

表B包含库存ID和类别之间的关系。添加日期表示库存何时添加到类别中,删除日期表示库存被删除的日期。如果删除日期为空,则表示该股票仍在该类别中。

  +---+----------+  ------- +------------+------------+
  |id | Stock_id |Category  | Add Date   | Remove Date|
  +---+----------+--------  +------------+------------+
  | 1 |        1 | Category1| 2017-09-03 | 2017-09-07 |
  | 2 |        1 | Category1|2017-09-09  | null       |
  +---+----------+--------  +------------+------------+

我的问题是提供时间范围,例如2017-09-05至2017-09-08。首先针对Stock1和Category1,我想计算与表b的时间重叠,即< 2017-09-05至2017-09-06>。然后将表A中的金额从2017-09-05汇总到2017-09-06。结果是(100 + 200)= 300.如果时间范围是2017-09-06到2017-09-10,则重叠是< 2017-09-06,2017-09-09到2017-09-10> 。总和结果是(200 + 200 + 200)= 600。

我该怎么做?谢谢大家!

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望在给定的日期范围内想要每个类别的库存量。如果是这样,这是一个正确加入表并聚合的问题:

select a.stock_id, b.category, sum(a.amount)
from a join
     b
     on a.stock_id = b.stock_id and a.date >= a.add_date and 
        (a.date <= b.remove_date or b.remove_date is null)
where a.date >= '2017-09-05' and b.date <= '2017-09-08'
group by a.stock_id, b.category;