1

我正在使用作为报告/视图存储在我们数据库中的库存分类帐。导出时,它看起来像这样:

Tran Type         Txn Date     Item     Quantity
Opening Balance   6/30/12      Item1     4
Opening Balance   6/30/12      Item2     7
Shipping          7/14/12      Item2    -1
Opening Balance   6/30/12      Item3     3
Shipping          7/2/12       Item3    -1
Opening Balance   6/30/12      Item4     5
Shipping          7/3/12       Item4    -1
Shipping          7/3/12       Item4    -1
Shipping          7/3/12       Item4    -1
Shipping          7/5/12       Item4    -1
Shipping          7/5/12       Item4    -1
Receiving         7/9/12       Item4    10

在导出之前,它不包含那些基于导出期间生成的“期初余额”条目。

我们正在尝试跟踪在给定期间内每件商品缺货的天数。第一步是按项目创建运行总计,这是我之前通过 Excel 中的数据透视表所做的。从那里开始,我需要灵活、动态地计算每个项目的库存天数为 0 数量(基于月、季度或年)。最初,我也希望通过数据透视表来考虑这个计数,为此我求助于超级用户。 不幸的是,通过 excel 完成这类工作似乎违反直觉,所以我将我的问题带到这里。

我在 Access 和 SQL Server 方面只有新手经验。我在 Oracle 和 PL/SQL 方面接受过一些简单的正式培训,但那是几年前的事了。可能会为此添加另一个复杂性,我无法将任何内容写入或永久保存到我们的系统后端(即使我有权限)。

到目前为止,我只想出了一个 T-SQL 语句来按项目创建运行总计:

Select 
 TxnDate,
    Quantity,
        Item,
    (SELECT Sum(Quantity)
    FROM DATABASE.dbo.InventoryLedger as D1
    WHERE D1.TxnDate <= D0.TxnDate AND D1.Item = D0.Item) as balance
    FROM DATABASE.dbo.InventoryLedger as D0
    where Item = 'Item4' and TxnDate >= 2012-07-01

在这之后我迷路了。我不知道我是否应该进行某种计数,或者找到一种方法来减去数量达到 0 的项目之间的日期,然后稍后再收到。我不确定如何根据已计算的余额列添加另一个聚合或计算列,我什至不确定如何翻译此查询,以便它将与我的相同数据的 Access 文件一起使用。我会接受 Access 或 T-SQL 格式的解决方案;我渴望真正学习 T-SQL,同时能够在 Access 中执行计数可以让我链接数据库并让我更容易生成直接报告。

我也很好奇是否有一种简单的方法可以查询每天每件商品的库存水平?我想这只是使用相同的确切数据来计算,所以这可能只是浪费时间和空间,对吧?

我很感激任何帮助,伙计们。几个月来,我一直在尝试提出一种解决方案来衡量缺货情况,这是我最接近的一次。谢谢。

4

1 回答 1

1

使用正确的窗口/分析功能集会容易得多。但我有一个想法,可能会奏效。

首先,您可以使用自联接获得累积总和。

然后,还对此进行自我加入以获得下一个非零 cum,并使用 group by 来获得下一条记录的最小日期:

with tcum as (
     select t.txnDate, t.Item, t.quantity, sum(tprev.quantity) as cumq
     from t left outer join
          t tprev
          on t.item = tprev.item and
             t.txnDate >= tprev.txnDate
     group by t.txnDate, t.Item, t.quantity
    )
 select tcum.item, tcum.txndate, MIN(tcumnext.txndate) as nextfilldate
 from tcum left outer join
      tcum tcumnext
      on tcum.item = tcumnext.item and
         tcum.date < tcumnext.date and
         tcumnext.cumq > 0 and
         tcum.cumq = 0
group by tcum.item, tcum.txndate
于 2012-07-17T16:14:50.117 回答