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

これは、適切なウィンドウ/分析関数のセットを使用すると、はるかに簡単になります。しかし、私にはうまくいくかもしれないアイデアがあります。

まず、自己結合を使用して累積合計を取得できます。

次に、これに対して自己結合を実行して次のゼロ以外の累積を取得し、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 に答える