【问题标题】:SQL Get previous stocks based on modified datesSQL 根据修改日期获取以前的股票
【发布时间】:2015-03-19 06:13:45
【问题描述】:

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

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 表示某个日期范围内修改的库存量。我需要选择以前日期的股票结果。假设在 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 中给定的日期范围来添加/减去以前日期的股票

在没有光标的情况下可以选择这样的数据吗?

【问题讨论】:

    标签: sql sql-server sql-server-2008-r2


    【解决方案1】:

    我会尝试这个答案,当然我在 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 |
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多