SQL 根据修改日期获取以前的股票

SQL Get previous stocks based on modified dates

我有一个非常奇怪的业务需求,需要用以下两个表来满足:

STOCK_TB (As of 20150319)

PRODUCT_ID STOCK_QTY 
   A          20
   B          15

STOCK_MODIFIED_TB

PRODUCT_ID MODIFIED_QTY MODIFIED_DATE_FROM MODIFIED_DATE_TO
   A          10             20150315         20150318
   B          -5             20150314         20150316
   A          -2             20150314         20150316

STOCK_TB代表库存的当前库存,而STOCK_MODIFIED_TB代表一个日期范围内修改的库存数量。我需要 select 之前日期的股票结果。假设在 20150319 检索到日期为 20150314-20150319 的结果。结果应该是这样的:

DATE    PRODUCT_ID  STOCK_QTY
20150314    A         18
20150314    B         10
20150315    A         28
20150315    B         10
20150316    A         28
20150316    B         10
20150317    A         30
20150317    B         15
20150318    A         30
20150318    B         15
20150319    A         20
20150319    B         15

换句话说,根据 STOCK_MODIFIED_TB

中给出的日期范围,之前日期的股票将是 added/subtracted

select在没有游标的情况下可以这样处理数据吗?

我会尝试这个答案,当然我在 select 中的子查询看起来性能不太好我猜...:

SQLFIddleExample

SELECT cast(a.Date as date) Date,
       st.PRODUCT_ID,
       st.STOCK_QTY + isnull((SELECT SUM(MODIFIED_QTY)
                       FROM STOCK_MODIFIED_TB
                      WHERE MODIFIED_DATE_FROM <= CONVERT(VARCHAR(10), a.Date, 112)
                      AND MODIFIED_DATE_TO >= CONVERT(VARCHAR(10), a.Date, 112)
                      AND PRODUCT_ID = st.PRODUCT_ID ),0) STOCK_QTY
FROM STOCK_TB st,
 (select DATEADD(day, number, '2015-01-01') Date 
from master..spt_values 
where type = 'p' ) a
WHERE a.Date between '2015-03-14' and '2015-03-19' 
ORDER BY a.Date, st.PRODUCT_ID 

结果:

|       Date | PRODUCT_ID | STOCK_QTY |
|------------|------------|-----------|
| 2015-03-14 |          A |        18 |
| 2015-03-14 |          B |        10 |
| 2015-03-15 |          A |        28 |
| 2015-03-15 |          B |        10 |
| 2015-03-16 |          A |        28 |
| 2015-03-16 |          B |        10 |
| 2015-03-17 |          A |        30 |
| 2015-03-17 |          B |        15 |
| 2015-03-18 |          A |        30 |
| 2015-03-18 |          B |        15 |
| 2015-03-19 |          A |        20 |
| 2015-03-19 |          B |        15 |