SQL-计算每月的每日库存水平作为可用性的总和

时间:2013-11-16 03:58:02

标签: sql ms-access-2007

我有一张表格,其中包含来自该地区不同仓库的股票的以下记录。这包含:

  1. ITEMNAME
  2. 的startDate
  3. 结束日期
  4. 字段是

    1. 密钥(PK)
    2. itemName-数字代码
    3. startDate- date
    4. endDate- date
    5. amt- number
    6. 包含3种商品类型的样本数据

      1     101     Jan 1,  2013    Jan 14, 2013    15  
      2     101     Jan 12, 2013    Jan 15, 2013    3  
      3     102     Jan 4,  2013    Jan 26, 2013    7  
      4     102     Jan 6,  2013    Jan 12, 2013    19              
      5     103     Jan 15, 2013    Jan 16, 2013    3  
      6     103     Jan 12, 2013    Jan 21, 2013    19
      

      如何编写一个查询,以获取此期间每天每次的项目数?基本上我需要有一个查询,它将在startDate和endDate之间添加适用的项目。感谢

      我希望最终查询结果看起来像会为每个项目添加重叠

      Jan 1   101  15  
      Jan 1   102  0  
      Jan 12  101  18  
      Jan 15  101  3   
      Jan 16  101  3
      

      虽然我知道我可以在特定日期做到

      SELECT item, sum(amt) 
      FROM [table] 
      WHERE (date>=startdate) AND (date<=enddate) 
      GROUP BY item
      

      如何启用它迭代整个月(1月1日至31日)以生成此类报告?

2 个答案:

答案 0 :(得分:1)

以下是您需要做的事情:

创建一个名为[DayNumbers]的表,并用1到31之间的数字填充它:

DayNumber
---------
        1
        2
        3
...
       30
       31

现在在Access中创建一个名为[MonthDates]的已保存查询,为指定月份中的每一天创建一行:

PARAMETERS SelectedYear Long, SelectedMonth Long;
SELECT DateSerial([SelectedYear], [SelectedMonth], DayNumber) AS StatusDate
FROM DayNumbers
WHERE Month(DateSerial([SelectedYear], [SelectedMonth], DayNumber)) = [SelectedMonth];

请注意,WHERE子句将天数限制为该月的实际天数(例如,4月份为30天)。

在Access名为[StockStatusRows]的Access中创建另一个已保存的查询,为每天和每个项目创建一行

SELECT StatusDate, itemName
FROM 
    MonthDates, 
    (
        SELECT DISTINCT itemName FROM StockData
    )  AS Items;

对于[StockStatus]中看起来像

的测试数据
key  itemName  startDate   endDate     amt
---  --------  ----------  ----------  ---
  1  101       2013-01-01  2013-01-14   15
  2  101       2013-01-12  2013-01-15    3
  3  102       2013-01-04  2013-01-26    7
  4  102       2013-01-06  2013-01-12   19
  5  103       2013-01-15  2013-01-16    3
  6  103       2013-01-12  2013-01-21   19
  7  101       2013-01-30  2013-02-03    6
  8  102       2013-02-05  2013-02-23    9
  9  103       2013-02-07  2013-03-02   11

[StockStatusRows]查询将返回

StatusDate  itemName
----------  --------
2013-01-01  101     
2013-01-02  101     
2013-01-03  101     
..
2013-01-30  101     
2013-01-31  101     
2013-01-01  102     
2013-01-02  102     
2013-01-03  102     
...
2013-01-30  102     
2013-01-31  102     
2013-01-01  103     
2013-01-02  103     
2013-01-03  103     
...
2013-01-30  103     
2013-01-31  103     

现在我们可以将实际股票价值汇总到一起:

SELECT ssr.StatusDate, ssr.itemName, Nz(sums.total, 0) AS TotalOnHand
FROM 
    StockStatusRows AS ssr 
    LEFT JOIN 
    (   
        SELECT StatusDate, itemName, Sum(amt) AS total
        FROM
            (
                SELECT md.StatusDate, sd.itemName, sd.amt
                FROM 
                    StockData sd 
                    INNER JOIN 
                    MonthDates md 
                        ON md.StatusDate>=sd.startDate 
                            And md.StatusDate<=sd.endDate
            )
        GROUP BY StatusDate, itemName
    )  AS sums 
        ON (sums.itemName=ssr.itemName) 
            AND (sums.StatusDate=ssr.StatusDate)
ORDER BY ssr.StatusDate, ssr.itemName;

返回

StatusDate  itemName  TotalOnHand
----------  --------  -----------
2013-01-01  101       15         
2013-01-01  102       0          
2013-01-01  103       0          
2013-01-02  101       15         
2013-01-02  102       0          
2013-01-02  103       0          
2013-01-03  101       15         
2013-01-03  102       0          
2013-01-03  103       0          
2013-01-04  101       15         
2013-01-04  102       7          
2013-01-04  103       0          
2013-01-05  101       15         
2013-01-05  102       7          
2013-01-05  103       0          
2013-01-06  101       15         
2013-01-06  102       26         
2013-01-06  103       0          
...
2013-01-12  101       18         
2013-01-12  102       26         
2013-01-12  103       19         
2013-01-13  101       18         
2013-01-13  102       7          
2013-01-13  103       19         
2013-01-14  101       18         
2013-01-14  102       7          
2013-01-14  103       19         
2013-01-15  101       3          
2013-01-15  102       7          
2013-01-15  103       22         
2013-01-16  101       0          
2013-01-16  102       7          
2013-01-16  103       22         
2013-01-17  101       0          
2013-01-17  102       7          
2013-01-17  103       19         
...
2013-01-22  101       0          
2013-01-22  102       7          
2013-01-22  103       0          
...
2013-01-31  101       6          
2013-01-31  102       0          
2013-01-31  103       0          

答案 1 :(得分:0)

select itemName from <Table-Name> where startDate>=(start-date) startDate<=(end-date) and endDate>=(start-date) and endDate<=(end-date) group by itemName.

这将计算(开始日期)和(结束日期)之间每种产品的数量总和。

如果您想要所有项目的总数而不论其类型,

select sum(quantity) from <Table-Name> where startDate>=(start-date) startDate<=(end-date) and endDate>=(start-date) and endDate<=(end-date) 

希望这有帮助