1

仕事で SQL を使用して情報を収集していますが、(まだ) 高度なものは何もありません。

在庫の在庫と在庫切れのパターンを特定する必要があります。

アイテム、場所、在庫、および日付を示すテーブルがあります。商品/場所が在庫切れになり、時間の経過とともに在庫が増えるパターンがあるかどうかを確認したい. このファイルには、3 週間分のデータが含まれています。ある商品が 3 週間以内に常に在庫切れまたは在庫切れになっている場合は、さらに調査するためにその商品について知る必要があります。

在庫がゼロより大きい場合、アイテム/場所は在庫があります。在庫がゼロまたはマイナスの場合、アイテム/ロケーションは在庫切れです。

ご協力ありがとうございます。

サンプルデータ

Item, location, inventory, date
1243, 10,       2,         3/12/2012
1243, 10,       0,         3/13/2012
1243, 10,      -2,         3/14/2012
1243, 10,      -2,         3/15/2012
1243, 10,       4,         3/16/2012

次に、追加のアイテム、場所、在庫、日付の記録。

出力の提案を受け入れます。商品/場所と、3週間分のデータで在庫と在庫切れが何回切り替わったかを確認するだけです.

4

2 に答える 2

2

このようなものがあなたが探しているものかもしれません。これは、 と の各組み合わせが「在庫あり」から「在庫なし」に、またはその逆に移動しitemた回数をカウントします。このロジックでは前のステータスがわからないため、各およびlocationの最初の行は遷移としてカウントできないことに注意してください。itemlocation

SELECT item,
       location,
       SUM( CASE WHEN status = 'In Stock' AND prior_status = 'Out of Stock'
                 THEN 1
                 ELSE 0
             END) moved_to_out_of_stock,
       SUM( CASE WHEN status = 'Out of Stock' AND prior_status = 'In Stock'
                 THEN 1
                 ELSE 0 
              END) moved_to_in_stock
  FROM (SELECT item, 
               location,
               status,
               lag( status ) over (partition by item, location
                                       order by dt) prior_status
          FROM (SELECT item, 
                       location, 
                       (case when inventory <= 0 
                             then 'Out of Stock'
                             else 'In Stock'
                         end) status,
                       dt
                  FROM your_table))
  GROUP BY item, location

これは、投稿されたサンプルデータで、在庫切れから在庫ありに 1 回、在庫ありから在庫切れに 1 回変化したことを示しています。

SQL> ed
Wrote file afiedt.buf

  1  with your_table as (
  2    select 1243 item, 10 location, 2 inventory, date '2012-03-12' dt from dual union all
  3    select 1243, 10, 0, date '2012-03-13' from dual union all
  4    select 1243, 10, -2, date '2012-03-14' from dual union all
  5    select 1243, 10, -2, date '2012-03-15' from dual union all
  6    select 1243, 10, 4, date '2012-03-16' from dual
  7  )
  8  SELECT item,
  9         location,
 10         SUM( CASE WHEN status = 'In Stock' AND prior_status = 'Out of Stock'
 11                   THEN 1
 12                   ELSE 0
 13               END) moved_to_out_of_stock,
 14         SUM( CASE WHEN status = 'Out of Stock' AND prior_status = 'In Stock'
 15                   THEN 1
 16                   ELSE 0
 17                END) moved_to_in_stock
 18    FROM (SELECT item,
 19                 location,
 20                 status,
 21                 lag( status ) over (partition by item, location
 22                                         order by dt) prior_status
 23            FROM (SELECT item,
 24                         location,
 25                         (case when inventory <= 0
 26                               then 'Out of Stock'
 27                               else 'In Stock'
 28                           end) status,
 29                         dt
 30                    FROM your_table))
 31*   GROUP BY item, location
SQL> /

      ITEM   LOCATION MOVED_TO_OUT_OF_STOCK MOVED_TO_IN_STOCK
---------- ---------- --------------------- -----------------
      1243         10                     1                 1
于 2012-04-06T20:04:01.403 に答える
0
SELECT Item
      ,location
      ,SUM(CASE WHEN inventory>0 THEN 1 END) AS INSTOCK
      ,SUM(CASE WHEN inventory<=0 THEN 1 END) AS OUTSTOCK
FROM TABLE
GROUP BY Item,location;
于 2012-04-06T20:04:51.417 に答える