表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。
我该怎么做?谢谢大家!
答案 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;